2017-03-14 125 views
0

我正在使用Kriskowal Q library来处理承诺。解决与Q.all同步的承诺(承诺)

我写了下面的函数,等到所有的promise都解决了。

function multiplePromises(targetArray) { 
    var promises = {}; 
    for (var i=0; i<targetArray.length; i++) { 
     var promise = singlePromise(); // any async. function 
     promises[i] = promise; 
    }; 
    return Q.all(promises); 
}; 

和我称之为如下:(?例如是同步的)

multiplePromises(targetArray).then(
    function(success){ 
     console.log("success"); 
    }, 
    function(error){ 
     console.log("error", error); 
    } 
); 

我想知道然而是否存在其中的承诺被解析的顺序。即该功能是否等待触发下一个承诺i+1,直到承诺i得到解决?或者,它与其他所有异步一样。方法,它实际上触发了所有单一的承诺,只是等到它们全部完成了?

如果第二种情况下,如何重写此函数以确保承诺i+1只有在承诺i已解决时才会触发?

更新:测试

我做了一个测试,把:

promises[i] = i; 

,以检查它是否解决sycnhronously,它似乎如此。但是,这可能只是我的异步函数足够快而能够快速地解决它。这看起来正确吗?

+0

什么sycnhronously'我想你的意思'serially' - 因为有绝对没有同步关于承诺 –

+0

清除。任何想法如何使它“连续”? – JohnAndrews

+0

是的,很容易,如果我只知道'Promise.resolve()'Q'相当于'' –

回答

1

有几种方法可以达到你想要

你的代码最小的变化将是

function multiplePromises(targetArray) { 
    var promises = []; 
    var p = Promise.resolve(); // I don't know the Q equivalent of this 
    for (var i=0; i<targetArray.length; i++) { 
     p = p.then(function() { 
      return singlePromise(); 
     }); 
     promises[i] = p; 
    }; 
    return Q.all(promises); 
}; 
你写的每`时间
+0

太棒了! 'promises [i] = promise'中的承诺是什么?它应该是'p'吗? – JohnAndrews

+0

对不起,这是正确的 –

0

承诺将由Q按您声明的顺序执行,但无法确保退货订单相同。这就是异步的工作原理。

如果你想让他们按顺序解决,我能想到的唯一方法就是一个接一个地调用他们,而不是一批一批的完成。

这等反应将提供更多的信息和一些解决方案: https://stackoverflow.com/a/36795097/7705625

0

承诺在理论上可以为了解决(它可能是很容易写一个例子中,他们会),但你不应该指望那。

的功能,如Promise.all()(或Q.all()Bluebird.all()等)的全部意义在于,如果对于所有承诺的等待得到解决,不管是什么样的,订单,并尽快它们都解决了,然后Promise.all()本身返回的承诺可以用原始承诺解决的值数组解决。

在该数组中,您将始终获得与作为参数Promise.all()的参数中的承诺顺序相同的顺序。但是原始承诺已经解决的时间顺序是未知的,并且不相关,因为这对使用Promise.all()的结果没有任何影响。

+0

是的,但在我的情况下,我真的需要解决它,因为先前的承诺会影响下一个承诺。 – JohnAndrews