2013-05-04 67 views
0

我需要使用一個隊列來序列化我的異步請求。環顧四周,我找到了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); 
      }) 
    } 

但它不是真正的序列化操作,因爲我看到它試圖運行多個請求。是否有可能將承諾和排隊結合起來,還是有更好的辦法?

謝謝。

+1

這應該工作。正如@Iain指出的那樣,文檔警告不要反覆調用'awaitAll',但即使如此(至少在當前版本的庫中)也不應該阻止它的工作。似乎它一定是別的東西。請注意,如果您只想保持連續隊列,則不需要調用'awaitAll',隊列將立即開始處理作業。 – numbers1311407 2013-05-04 04:38:09

+0

+1謝謝。我嘗試不用等待,它仍然有效。我不關心任務完成後的最終結果,並希望這樣做沒有害處。再次感謝 – bsr 2013-05-04 13:00:29

+0

這是一個非常酷的小型庫,但我認爲它正在遭受身份危機(是一個隊列還是一個串行/並行任務運行者?)。這可能不是問題,但應該注意的是,如果用作無限期運行的隊列,它會有內存泄漏,因爲作業的結果會永久存儲,等待「await(All)」 。 – numbers1311407 2013-05-04 15:49:59

回答

2

https://github.com/mbostock/queue說,大約等待和awaitAll:

This method should only be called once, after any tasks have been 
deferred. If the await callback is set multiple times, or set before 
a task is deferred, the behavior of the queue is undefined. 

此刻,你每次推遲任務,這是一些明確的龍發癢時間後打電話awaitAll。在排好所有東西之後,你有沒有可以全部等待的地方?如果不是,這個特別的圖書館可能不適合你。

+0

我也讀了這一點,但看着[源](https://github.com/mbostock/queue/blob/master/queue。js#L69)似乎所有的'await'函數都會覆蓋隊列消耗時執行的回調函數,並在隊列已經爲空時調用它。我沒有立即看到爲什麼OP的代碼不起作用。有什麼想法嗎? – numbers1311407 2013-05-04 03:43:03

+0

你是對的,從源頭上看不明白爲什麼它不起作用。我只是在哲學上反對做文檔說你不應該做的事情,並希望在這種情況下,這種反對意見可能會轉化爲錯誤修正。接下來的問題是:refresh()會做什麼?你是否證明在請求實際完成之前,AsyncOper()不能解析? 「q」只有一個賦值,它肯定有1的並行性? – Iain 2013-05-04 05:01:49

+0

謝謝@ numbers1311407。你的意見真的有幫助。我的AsyncOper是一系列(鏈)異步操作,我沒有序列化其中的一個。一旦我序列化鏈中的所有操作,它都可以正常工作。再次感謝您的幫助。 – bsr 2013-05-04 13:03:03