2017-04-17 13 views
0

forループでnode.jsサーバーから( 'request'パッケージを使用して)複数のHTTPリクエストを送信しようとしています。Node.js - forループで複数のHTTP GETを送信するリクエストを使用しています

基本的な考え方は、URLの配列を持ち、それぞれにHTTP getを送信し、responseArrayという配列にレスポンスを格納することです。

これを試してみると「未定義」になりますが、forループ内のコンソールにログを記録するとリクエストが機能していることがわかります。

function apiCalls() { 
 

 
    var URLs = [‘URL1’, ‘URL2’, ‘URL3’]; 
 
    var responseArray = [] 
 
    for (var i = 0; i < URLs.length; i++) { 
 
    request({ 
 
     url: URLs[i], 
 
     method: 'GET', 
 
     headers: { 
 
     'Connection': 'close' 
 
     }, 
 
    }, function(error, response, body) { 
 
     if (error) { 
 
     console.log(error); 
 
     } else { 
 
     responseArray.push(String(response.body)); 
 
     console.log(responseArray) // this is showing me all the data in the array correctly 
 
     return responseArray; 
 
     } 
 
    }) //end request function 
 
    } //end for loop 
 
    console.log(responseArray) 
 
} //end apiCalls function 
 
apiCalls()

だから、スタックオーバーフローとelsehwereにここではいくつかの異なるソリューションを見た後、私は約束を使用してみました。私はのためのループの後responseArrayを記録しようとしたとき、私は常に空の配列を取得

var apiCalls = new Promise(function(resolve, reject) { 
 
    var URLs = [‘URL1’, ‘URL2’, ‘URL3’]; 
 
    var responseArray = []; 
 
    for (var i = 0; i < URLs.length; i++) { 
 
    process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; 
 
    request({ 
 
     url: URLs[i], 
 
     method: 'GET', 
 
     headers: { 
 
     'Connection': 'close' 
 
     }, 
 
    }, function(error, response, body) { 
 
     if (error) { 
 
     console.log(error); 
 
     } else { 
 
     resolve(responseArray.push(String(response.body)) 
 
     } 
 
    }) //end request 
 

 
    } //end for loop 
 
}) 
 

 
apiCalls.then(function(result) { 
 
    console.log('this is calling the promise') 
 
    console.log(result) 
 
}, function(err) { 
 
    console.log(err) 
 
});

:私は前にそれらを使用しないとgoogle example

の約束を、これをオフに基づいて、決してました。代わりに - 私は「未定義」を取得私はそうのような変数に返された配列を割り当てようとします

var gimmeAllResponses = apiCalls(); 
 
console.log(gimmeAllResponses); //returns 'undefined'

誰も私が間違っているつもりですどこ私を見ることができますか? forループが終了した後、どのように 'responseArray'データを更新するのですか?

+1

あなたは 'undefined'をどこで取得していますか?コンソールで? 'console.log(error)'ステートメントですか? – amn

答えて

1

これは、別のパッケージrequest-promiseを必要とするため、これは少しオフです。

あなたは何度も解決しています。 Node.jsを使用しているので、ES6機能が利用可能である可能性が非常に高いです。 Array.prototype.map()Promise.all()を使用してください:

var rp = require('request-promise'); 
var URLs = [‘URL1’, ‘URL2’, ‘URL3’]; 
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; 
var responseArray = Promise.all(URLs.map((url) => rp({ 
    uri: url, 
    method: 'GET', 
    headers: { 
    'Connection': 'close' 
    } 
}).then((error, response, body) => { 
    if (error) { 
     console.log(error); 
    } else { 
     return String(response.body); 
    } 
    }))); 
関連する問題