あなたがこれを行うことができますカップルの方法があります。 request()
へのすべての呼び出しは非同期であり、ループが終了してからしばらく後に終了するので、何とかそれらを追跡する必要があります。プロミスを使用する方法とカウンターを使用する方法の2つの方法を示します。おかげでたくさんのHardik-ジャイナ教、@
約束
// create wrapper function that returns a promise
function requestPromise(options) {
return new Promise(function(resolve, reject) {
request(options, function(error, response, body) {
if (error) return reject(error);
resolve({response: response, body: body});
});
});
}
var arr = ["A" , "B", "C" , "D" , "E"];
Promise.all(arr.map(function(item) {
// create options object here for each request
var options = {
method: 'GET',
url:"some_url",
headers: {...}
};
return requestPromise(options);
})).then(function(results) {
// process results here
// call next() here because all processing is now done
next();
}).catch(function(err) {
// error happened
next(err);
});
マニュアルカウンター
var arr = ["A" , "B", "C" , "D" , "E"];
var errDone = false;
var cntr = 0;
arr.forEach(function (arrayItem) {
var options = {
method: 'GET',
url:"some_url",
headers: {...}
};
request(options, function (error, response, body) {
if (error) {
if (!errDone) {
// latch error so we don't call next(error) multiple times
errDone = true;
next(error);
}
} else {
// process result here
// check if this is the last response
++cntr;
if (cntr === arr.length) {
// all responses done here
next();
}
}
});
こんにちは@ jfriend00 - ありがとう、それは本当に私に全く新しいこのコンセプトを理解するのを助けました。 あなたの解決策に関するちょっとしたフォローアップの質問 - catch()メソッドでは、エラーには失敗したリクエストの特定のレスポンスとその詳細がすべて含まれていますか?応答のエラーメッセージ? –
@GadiBenAmram - 最初に失敗した 'request()'の 'error'値が含まれます。必要に応じて、より多くの情報を含む独自のオブジェクトを構築し、 'reject(error)'の代わりに 'reject(yourObj)'を呼び出すだけで、より多くの情報を含めることができます。 – jfriend00
それを得ました! @ jfriend00もう一度ありがとう、それは本当に本当に助けになりました:-)。 –