【问题标题】:How to loop on queue of promises (serialize async messages)如何循环承诺队列(序列化异步消息)
【发布时间】:2014-02-13 17:42:26
【问题描述】:

我有一个需要按顺序处理的承诺队列(代表消息)。 我正在使用 angularJS。

为了这个例子,假设我有connect(),它返回一个连接的承诺,然后是msgQueue,它是一个JavaScript 的承诺数组,每个代表一个消息。

我会先这样做:

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

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

我是一个推迟/承诺的新手,所以请耐心等待。

谢谢!

【问题讨论】:

    标签: javascript angularjs promise deferred


    【解决方案1】:
    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 中获取第一条消息,并设置它的解析处理程序来处理数据,然后在队列上递归。当队列中没有任何东西时,递归将转储。

    【讨论】:

    • 如果消息太多,递归解决方案不会导致堆栈溢出(没有双关语)吗?
    • 我收回我的评论 - 因为它是异步的,所以没有实际的递归,也没有堆栈增长。
    • Erlang 中的编程让你认为这是一个程序的自然流程。不敢相信我不得不查一下,我想我已经有一段时间没有进入 Erlang 土地了。 ://
    【解决方案2】:

    这样的事情会奏效。假设 msgQueue.dequeue() 返回一个承诺。

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

    【讨论】:

      猜你喜欢
      • 2018-11-03
      • 2017-10-22
      • 2011-07-17
      • 1970-01-01
      • 1970-01-01
      • 2017-10-30
      • 2018-01-23
      • 2017-07-18
      • 2013-04-12
      相关资源
      最近更新 更多