我需要使用一個隊列來序列化我的異步請求。環顧四周,我找到了Mike Bostock的一個小型圖書館here。但我有點困惑,因爲如何將它與promise對象一起使用。涉及承諾的隊列異步操作
所以,我有很多來自用戶界面的reqs。
function addTask(d){
AsyncOper(d)
.then(function() {
refresh()
});
}
AsyncOper返回一個promise對象(angular js implementation - $ q)。
我已經水性定義爲
var q = queue(1);
我怎麼能拒絕addTask
使用q
我第一次嘗試如下:
function addTask(d){
q.defer(request, d)
q.awaitAll(function(error, results) { console.log("all done!"); });
}
function request(d, cb) {
AsyncOper(d)
.then(function() {
refresh();
cb(null, "finished "+ d);
})
}
但它不是真正的序列化操作,因爲我看到它試圖運行多個請求。是否有可能將承諾和排隊結合起來,還是有更好的辦法?
謝謝。
這應該工作。正如@Iain指出的那樣,文檔警告不要反覆調用'awaitAll',但即使如此(至少在當前版本的庫中)也不應該阻止它的工作。似乎它一定是別的東西。請注意,如果您只想保持連續隊列,則不需要調用'awaitAll',隊列將立即開始處理作業。 – numbers1311407 2013-05-04 04:38:09
+1謝謝。我嘗試不用等待,它仍然有效。我不關心任務完成後的最終結果,並希望這樣做沒有害處。再次感謝 – bsr 2013-05-04 13:00:29
這是一個非常酷的小型庫,但我認爲它正在遭受身份危機(是一個隊列還是一個串行/並行任務運行者?)。這可能不是問題,但應該注意的是,如果用作無限期運行的隊列,它會有內存泄漏,因爲作業的結果會永久存儲,等待「await(All)」 。 – numbers1311407 2013-05-04 15:49:59