因此,我正在圍繞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
參數傳遞。正如你所看到的,我將記錄每個響應包含的主題issues
變量之前包含多少個問題的長度。
的輸出,從總共869個結果是這樣的:
369
[]
500
[]
爲什麼我的問題變量空當我登錄它呢?顯然有結果與它連接。
更常見的問題:這種方法是我想要實現的最好方法嗎?我想,即使我的代碼確實起作用,異步性的本質意味着完全有可能將結果以錯誤的順序連接起來。
我應該只使用同步請求庫嗎?
啊,我傻CONCAT。真正有趣的解決方案使用承諾!以前沒有用過它,會給它一個旋轉,謝謝。 – Jazcash
@Jazcash - 是的,對於這個特定情況的承諾,一個非常好的事情是'Promise.all()'爲您收集結果,即使您並行運行請求也是如此。它還提供更好的錯誤處理。這將返回給調用者(通過返回的承諾),這是發生在請求循環中任何地方的錯誤。你的代碼沒有返回錯誤。 – jfriend00