为了账号安全,请及时绑定邮箱和手机立即绑定

如何同步一系列承诺?

如何同步一系列承诺?

繁星coding 2019-07-11 20:55:29
如何同步一系列承诺?我有一个承诺对象数组,这些对象必须按照数组中列出的相同顺序进行解析,也就是说,在解析完前一个元素(作为方法)之前,我们不能尝试解析一个元素。Promise.all([...]))。如果一个元素被拒绝,我需要链立即拒绝,而不试图解析以下元素。我如何实现这一点,或者是否存在这样的现有实现?sequence模式?function sequence(arr) {     return new Promise(function (resolve, reject) {         // try resolving all elements in 'arr',         // but strictly one after another;     });}编辑最初的答案表明我们只能sequence这种数组元素的结果,而不是它们的执行,因为它是在这样的示例中预先定义的。但是,如何产生一系列的承诺,以避免早期执行呢?下面是一个修改过的示例:function sequence(nextPromise) {     // while nextPromise() creates and returns another promise,     // continue resolving it;}我不想把它变成一个单独的问题,因为我认为这是同一个问题的一部分。解下面的一些答案和随后的讨论有点误入歧途,但最终的解决方案,正是我所寻求的,是在内部实现的。斯皮克斯图书馆,作为方法序列..该方法可以遍历动态长度序列,并根据应用程序的业务逻辑创建承诺。后来,我把它变成了一个共享库,供大家使用。
查看完整描述

3 回答

?
波斯汪

TA贡献1811条经验 获得超4个赞

承诺代表价值而不是行动本身。操作是已经开始所以你不能让他们彼此等待。

相反,您可以同步返回承诺的函数按顺序调用它们(例如通过具有承诺链的循环),或使用.each方法在蓝知更鸟。


查看完整回答
反对 回复 2019-07-11
?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

不能简单地运行X异步操作,然后按顺序解析它们。

这样做的正确方法是,只有在解决之前的一个异步操作之后才运行新的异步操作:

doSomethingAsync().then(function(){
   doSomethingAsync2().then(function(){
       doSomethingAsync3();
       .......
   });});

编辑
似乎您希望等待所有的承诺,然后以特定的顺序调用它们的回调。就像这样:

var callbackArr = [];var promiseArr = [];promiseArr.push(doSomethingAsync());
callbackArr.push(doSomethingAsyncCallback);promiseArr.push(doSomethingAsync1());
callbackArr.push(doSomethingAsync1Callback);.........promiseArr.push(doSomethingAsyncN());
callbackArr.push(doSomethingAsyncNCallback);

然后:

$.when(promiseArr).done(function(promise){
    while(callbackArr.length > 0)
    {
       callbackArr.pop()(promise);
    }});

当一个或多个承诺失败时,就会出现这样的问题。


查看完整回答
反对 回复 2019-07-11
  • 3 回答
  • 0 关注
  • 497 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信