猿问

如何同步一系列承诺?

如何同步一系列承诺?

我有一个承诺对象数组,这些对象必须按照数组中列出的相同顺序进行解析,也就是说,在解析完前一个元素(作为方法)之前,我们不能尝试解析一个元素。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;}

我不想把它变成一个单独的问题,因为我认为这是同一个问题的一部分。

下面的一些答案和随后的讨论有点误入歧途,但最终的解决方案,正是我所寻求的,是在内部实现的。斯皮克斯图书馆,作为方法序列..该方法可以遍历动态长度序列,并根据应用程序的业务逻辑创建承诺。

后来,我把它变成了一个共享库,供大家使用。



慕哥9229398
浏览 342回答 3
3回答

万千封印

承诺代表价值而不是行动本身。操作是已经开始所以你不能让他们彼此等待。相反,您可以同步返回承诺的函数按顺序调用它们(例如通过具有承诺链的循环),或使用.each方法在蓝知更鸟。

Smart猫小萌

不能简单地运行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);     }});当一个或多个承诺失败时,就会出现这样的问题。
随时随地看视频慕课网APP
我要回答