2014-11-30 3 views
0

저는 nodejs를 처음 사용하여 비동기 동작에 어려움을 겪고 있습니다. 내가하고 싶은 것은 REST API를 작성하는 것입니다.이 API는 다른 API를 사용하며 이러한 결과에 종속됩니다. 내가 시도한 것은 API 호출자에게 보내기 전에 호출을 함수 [1]에 캡슐화하고 데이터를 수집하여 [2] 처리합니다. 문제는 [2] 데이터를 수집 할 때 값으로 끝나는 callApiX 함수 [1]이 여전히 실행 중이라는 것입니다. 또한 함수의 일부를 두 번 이상 호출하고 값을 비교해야합니다.비동기 작업으로 인해 일관성없는 결과가 발생합니다.

[1] API를 호출하는 기능 :

function callApi1() { 
    var result = 
    { 
     "code": "", 
     "name": "", 
     "lat": 0, 
     "lng": 0 
    }; 
    var request = require("request"); 
    var url = "someurl"; 
    request({ 
     url: url, 
     json: true 
    }, function (error, response, body) { 
     if (!error && response.statusCode === 200) { 

      // fill result 
      result.code = body.code; // etc. 

      // the correct result is being displayed 
      console.log(result); 

      return result; 
     } 
    }) 
} 

function callApi2() // ... 

[2] 기능에서 데이터를 얻을 나는 아마도이 문제를 해결할 수있는 방법

var express = require('express'); 
var router = express.Router(); 

app.route('/api') 
.get(function(req, res) { 

    // array for results 
    var results = []; 

    // all this data is going to be undefined, since the callApiX functions [1] are still running 
    results += callApi1(); 
    results += callApi2(); 
    results += callApi3(); 

    // do something with the data collected in results before being sent back to the caller of my API 

    res.json(results); // output: {undefinedundefinedundefined} 

}); 

를 요청하는 추가?

+0

환상적인 ** async ** 세계에 오신 것을 환영합니다! 너는 그렇게 할 수 없다. 대신, 약속을 사용하십시오. – SLaks

+0

어떤 구현을 사용 하시겠습니까? – Ronin

+0

나는 [Q] (https://github.com/kriskowal/q)를 좋아한다. – SLaks

답변

1

, 당신은 당신이 그들 중 하나가 당신이 사용 async이 문제를 해결할 수있는 방법을

예 아래에 볼 수있는, 원하는 것을 달성 할 수있는 방법을 여러 가지 방법 (중첩 콜백, 약속 ...)가 있습니다

npm install async 

JS :

문서에서 어떤 기능을 병행 할
var async = require('async');  

function callApi1 (callback) { 
    var result = 
    { 
     "code": "", 
     "name": "", 
     "lat": 0, 
     "lng": 0 
    }; 
    var request = require("request"); 
    var url  = "someurl"; 

    request({ 
     url: url, 
     json: true 
    }, function (error, response, body) { 
     if (!error && response.statusCode === 200) { 
      result.code = body.code; 
      return callback(null, result) 
     } else { 
      callback(error); 
     } 
    }) 
} 

function callApi2() // ... 


var express = require('express'); 
var router = express.Router(); 

app.route('/api') 
.get(function(req, res) { 

    async.parallel([ 
     function(callback){ 
      callApi1(callback); 
     }, 
     function(callback) { 
      callApi2(callback); 
     }, 
     function(callback){ 
      callApi3(callback); 
     } 
    ], function (err, results) { 
     res.json(results); 
    }); 

}); 

,

이전 함수가 완료 될 때까지 기다리지 않고 함수의 tasks 배열을 병렬로 실행하십시오. 함수 중 하나라도 오류가 콜백에 전달되면 오류 값으로 주 콜백이 즉시 호출됩니다. 작업이 완료되면 결과는 이고 최종 콜백은 배열로 전달됩니다.

관련 문제