2017-01-07 2 views
1

비동기 지식없이 노드를 시작하고 어떻게 콜백의 일부로 데이터를 배열로 푸시 할 수 있는지 궁금합니다. 출력 배열은 선언되었지만 요청 콜백 내에서 참조 될 때 정의되지 않습니다. 해당 변수를 콜백 함수 범위에 전달하는 간단한 방법이 있습니까?nodejs가 요청을 가지고 루프 for for 루프를 푸시

이상적으로는 호출자에게 각 요청의 결과 배열을 보내고 싶습니다.

const request = require('request'); 

module.exports = { 

apiRatingCall: function (input, callback) { 

var output = [] 

    for (var i = 0; i < input.length; i++) { 
    var options = { 
    url: 'someAPIURL' + '?longitude=' + input[i].longitude + '&latitude=' + input[i].latitude + '&name=' + input[i].name, 
    headers: { 
     'x-api-version': 2 
    } 
    }; 

    request(options, function (error, response, body) { 
    if (!error && response.statusCode == 200) { 

     var info = JSON.parse(body) 
     output.push(info) // this is not working as ouput is undefined at this point 
    } 
    }) 
    } 
    callback(output) 
    } 
} 

감사

답변

0

내 대답을 실행할 수 있습니다 내가

약속이 문제에 대한 유일한 방법입니다
module.exports = { 

apiRatingCall: function (input, callback) { 

var output = [] 

for (var i = 0; i < input.length; i++) { 
var options = { 
    url: 'someAPIURL' + '?longitude=' + input[i].longitude + '&latitude=' + input[i].latitude + '&name=' + input[i].name, 
headers: { 
    'x-api-version': 2 
} 
}; 

request(options, function (error, response, body) { 
    if (!error && response.statusCode == 200) { 

    var info = JSON.parse(body) 
    output.push(info) // this is not working as ouput is undefined at this point 
    } 
}) 
} 
setTimeout(function(){ 
    callback(output) 
},500) 

} 
} 
+0

네트워크 연결이 충분히 빠르지 않고 모든 응답이 500mils만큼 돌아 오지 않으면 어떻게합니까? –

0

당신은 for 루프의 끝을 확인하고하여 프로그래밍 어쩌면 매우 규범 아닌 callback

var loopCallback = function(error, response, body) { 
    if (!error && response.statusCode == 200) { 
    var info = JSON.parse(body) 
    output.push(info) 
    } 
    if(i == input.length - 1){ //checking index for completion of loop 
    callback(output); 
    } 
} 

request(options, loopCallback}) 
+1

Ajax 요청은 일반적으로 발급 된 것과 동일한 순서로 응답을받지 못합니다. 콜백을 마지막 콜백에 놓는 것은 다른 콜백이 끝났음을 보장하지 않습니다. – 4castle

+0

위대한 -하지만 출력 변수는 여전히 null이며 그것에 푸시 된 데이터를 얻지 못했습니다. 요청 콜백 내에서 배열로 푸시 할 수있는 방법이 있습니까? –

+0

@ 4castle 감사합니다. 맞습니다. 적절한 해결 방법이 생길 때까지 해결 방법으로 간주 할 수 있습니다. –

0

async 모듈을 살펴보십시오. bluebird와 promise를 사용하고 싶지 않다면 배열과 콜렉션을 사용하여 비동기 연산을 수행하는 것이 좋은 모듈입니다.

npm install async -S를 수행하십시오.

const request = require('request'); 
const async = require('async); 

module.exports = { 

    apiRatingCall: function (inputs, callback) { 

    var output = [] 


    async.each(inputs, function(input, cb) { 
     var options = { 
     url: 'someAPIURL' + '?longitude=' + input.longitude + '&latitude=' + input.latitude + '&name=' + input.name, 
     headers: { 
     'x-api-version': 2 
     } 
     request(options, function (error, response, body) { 
     if (!error && response.statusCode == 200) { 

      var info = JSON.parse(body) 
      output.push(info); 
      cb(); 
     }else{ 
      //if any of the request fails then return error 
      cb(error); 
     } 
    }) 

    }, function(err){ 
     if(!err){ 
     return callback(output); 
     }else{ 
     //if any of the request return error 
     return callback(err); 
     } 
    }); 
}