2014-02-13 97 views
2

我有一個承諾隊列(表示消息),我需要按順序處理。 我正在使用angularJS。如何循環承諾隊列(序列化異步消息)

爲了示例的緣故,假設我有connect(),它返回承諾,然後msgQueue這是一個JavaScript承諾數組,每個代表一個味精。

我會做這樣開始:

connect().then(function(){ 
    return msgQueue.dequeue(); 
}); 

// Async Loop on all msgs... How? 

我還算一個推遲/無極新手如此忍受我。

謝謝!

回答

3
function serializeAsynch(queue,operate) { 
    var msg = queue.dequeue(); 
    if (msg) msg.then(function(data) { operate(data); serializeAsynch(queue); }); 
} 

connect().then(function() { serializeAsynch(msgQueue,process); }); 

我認爲這會工作。我們正在等待connect解決,然後通過msgQueue。我們在queue中獲得第一條消息,並設置它的解析處理程序來處理數據,然後在隊列上遞歸。當隊列中沒有任何東西時,遞歸會轉儲出去。

+0

如果消息過多,遞歸解決方案是否會導致堆棧溢出(無雙關語)? – Ben

+0

我把我的評論帶回去 - 因爲它是異步的,所以沒有實際的遞歸和堆棧增長。 – Ben

+0

用Erlang進行編程可以讓你認爲這是程序的自然流程。我不敢相信自己一定要看這個,自從我進入Erlang之後,我有一段時間了。 :/ – joshperry

0

這樣的事情會起作用。假設msgQueue.dequeue()返回承諾。

function doWork(work) { 
    work().then(function(data) { 
     //process data 
     msgQueue.dequeue().then(function(work) { 
      doWork(work); 
     }); 
    }); 
}