APIの周りに単純なラッパーを構築して、特定のエンティティのすべての結果を取得します。 APIメソッドは一度に最大500件の結果しか返せませんが、結果を取得するインデックスを指定するために使用できるskip
パラメータを使用してすべての結果を取得できます。 APIには、合計で存在する結果の数を返すメソッドもあります。API応答を非同期的に正しい順序で連結する
request
パッケージを使用して時間を費やして、すべての結果を順番に連結し、すべての結果を通過させるコールバックを実行しています。
これは、現在、私のコードです:
Donedone.prototype.getAllActiveIssues = function(callback){
var url = this.url;
request(url + `/issues/all_active.json?take=500`, function (error, response, body) {
if (!error && response.statusCode == 200) {
var data = JSON.parse(body);
var totalIssues = data.total_issues;
var issues = [];
for (let i=0; i < totalIssues; i+=500){
request(url + `/issues/all_active.json?skip=${i}&take=500`, function (error, response, body){
if (!error && response.statusCode == 200) {
console.log(JSON.parse(body).issues.length);
issues.concat(JSON.parse(body).issues);
console.log(issues); // returns [] on all occasions
//callback(issues);
} else{
console.log("AGHR");
}
});
}
} else {
console.log("ERROR IN GET ALL ACTIVE ISSUES");
}
});
};
は、だから私は空の配列、issues
でオフ始めています。 forループを繰り返し、毎回i
を500ずつ増やして、それをskip
paramとして渡します。ご覧のとおり、各応答にメインのissues
変数を連結する前に、各応答に含まれる問題の長さを記録しています。 869の結果の合計から
出力は、このです:私はそれをログアウトするとき
369
[]
500
[]
なぜ私の問題は、空の変数のですか?それを連結する明確な結果があります。
もっと一般的な質問:私が達成しようとしていることについては、このアプローチが最善の方法ですか?私は自分のコードが機能したとしても、非同期の性質は結果が間違った順序で連結される可能性があることを意味していました。
同期要求ライブラリを使用するだけでいいですか?
ああ、私の愚かな:ここで
は(非同期Node.jsの中に処理するために非常に有用である)、同期、エラー伝播のための約束を使用して信頼性のために、すべての結果を収集するための方法です連結。約束を使って本当に面白い解決策!前にそれらを使用していない、それはスピン、感謝を与えるだろう。 – Jazcash
@ Jazcash - この特定のケースの約束について本当にうれしいことは、リクエストを並行して実行しても、Promise.all()が順番に結果を収集することです。また、エラー処理の方がはるかに優れています。これは、(返された約束によって)呼び出し元に戻ります。これは、要求ループのどこかで発生するエラーです。コードでエラーが返されませんでした。 – jfriend00