Javascript 承诺。全部()破坏顺序链接

Javascript 承诺。全部()破坏顺序链接,javascript,promise,Javascript,Promise,在过去,我曾使用jQuery deffered/Promissions,但我正在尝试使用javascript Promissions。我有一个函数,它需要按顺序进行几个网络调用,然后按任意顺序进行几个网络调用,但都需要在继续之前解决。我从顺序调用开始,它们按顺序进行,但是根据第二次调用的结果,我需要对这些结果进行迭代,并对进一步的调用进行可变编号(此时为6)。我不在乎这些是按什么顺序完成的,但我需要等待所有这些问题解决后再继续。我认为这种模式会奏效。但事实并非如此 function doLots

在过去,我曾使用jQuery deffered/Promissions,但我正在尝试使用javascript Promissions。我有一个函数,它需要按顺序进行几个网络调用,然后按任意顺序进行几个网络调用,但都需要在继续之前解决。我从顺序调用开始,它们按顺序进行,但是根据第二次调用的结果,我需要对这些结果进行迭代,并对进一步的调用进行可变编号(此时为6)。我不在乎这些是按什么顺序完成的,但我需要等待所有这些问题解决后再继续。我认为这种模式会奏效。但事实并非如此

function doLotsOfStuff(){

    firstNetworkCall()
        .then(function(data){
            // do stuff with data
            return secondNetworkCall();
        })
        .then(function(data){
            // do stuff with data

            var promises = data.map(function(item){
                // All of these calls (happens to be 6)
                // need to be done before I continue
                return thirdIndependentCall(item.Info);
            });

            // at this point I see [Promise, Promise, ....]
            // all are unresolved

            return Promise.all(promises);
        })
        .then(function(results){
            // executes immediately after the Promises.all() line
            // none of them are resolved
            // results is just one unresolved promise
        });
}
我可以把最后一步连在承诺上

return Promise.all(promises)
        .then(function(results){
            // this works!
         })
但是,如果我想在那之后把更多的东西链起来,我就必须不断地介入。好像我遗漏了一些信息

编辑

我在我的简化代码中复制了一个打字错误,而不是在我的实际代码中。在我的链中添加一个
.catch()
的建议很好,我试了一下。现在它抛出
firstNetworkCall(…)。然后(…)。然后(…)。catch不是一个函数。

我认为问题在于我的一些代码(某处)仍然依赖于
jQuery.Deffered
,这不符合承诺

很高兴知道我的初始模式应该可以工作——如果我与我正在使用的异步处理类型一致的话。

更改以下内容:

Promises.all(promises)
为此:

Promise.all(promises)
您正在抛出一个异常(因为
承诺
未定义,
.then()
捕获该异常,然后拒绝承诺链)

这是一个典型的原因,为什么您应该在链的末尾总是有一个
.catch()
,因为如果您记录拒绝,它可能会告诉您错误是什么


如果您想将任何jQuery承诺转换为ES6承诺,以便可以在任何地方使用
.catch()
,或者只是为了保证一致的行为,您可以使用
Promise.resolve()
将它们包装起来,如下所示:

       Promise.resolve(firstNetworkCall()).then(...).catch(...)
或者这个:

       var promises = data.map(function(item) {
            // All of these calls (happens to be 6)
            // need to be done before I continue
            return Promise.resolve(thirdIndependentCall(item.Info));
        });

        // at this point I see [Promise, Promise, ....]
        // all are unresolved

        return Promise.all(promises);
此外,请记住,一些较新的jQuery版本比其他版本更兼容ES6承诺。

更改此选项:

Promises.all(promises)
为此:

Promise.all(promises)
您正在抛出一个异常(因为
承诺
未定义,
.then()
捕获该异常,然后拒绝承诺链)

这是一个典型的原因,为什么您应该在链的末尾总是有一个
.catch()
,因为如果您记录拒绝,它可能会告诉您错误是什么


如果您想将任何jQuery承诺转换为ES6承诺,以便可以在任何地方使用
.catch()
,或者只是为了保证一致的行为,您可以使用
Promise.resolve()
将它们包装起来,如下所示:

       Promise.resolve(firstNetworkCall()).then(...).catch(...)
或者这个:

       var promises = data.map(function(item) {
            // All of these calls (happens to be 6)
            // need to be done before I continue
            return Promise.resolve(thirdIndependentCall(item.Info));
        });

        // at this point I see [Promise, Promise, ....]
        // all are unresolved

        return Promise.all(promises);

另外,请记住,一些较新的jQuery版本比其他版本更兼容ES6承诺。

您正在展示的代码应该可以按预期工作。您是否可以添加一个示例,说明“如果我想在之后链接更多的东西,我必须不断加入它们”的含义
中的
s
是否承诺。所有的
都是打字错误?这似乎应该是一个错误。您正在显示的代码应该可以按预期工作。您是否可以添加一个示例,说明“如果我想在之后链接更多的东西,我必须不断地将它们加入”的意思“
中的
s
是否承诺。所有的
都是打字错误?似乎这应该是一个错误。@Bergi-除了学习始终使用
.catch()之外”
至少记录日志,以便您可以记录并查看自己的编程错误,这可能比仅仅关闭更有用。我重复了许多,但有时对OP的具体问题的一些直接解释对每个人都比重复更有用。不幸的是,有一个输入错误,但它是在创建简化版本以便在此处发布时出现的。我添加了catc这就抛出了一个错误,catch不是一个函数。我认为问题是我的其他一些代码仍然依赖于jQuery Deffered,有些代码使用Promise。因此,很高兴知道,如果真的是turtles,那么我所拥有的应该可以用。@Rothrock-好吧,如果你在他里面混合了jQuery Promise和ES6 Promise调用我们无法告诉我们什么是什么,这使得我们很难帮助您。我们还需要知道您使用的jQuery版本,因为有些版本比其他版本更兼容ES6承诺。@Rothrock-您可以使用
Promise.resolve()包装任何jQuery承诺
这将把它们转换为ES6标准承诺,它将与
.catch()
一起使用。例如,
Promise.resolve(firstNetworkCall())。然后(…).catch(…)
@Bergi-除了学习始终拥有
.catch()
至少记录日志,以便您可以记录并查看自己的编程错误,这可能比仅仅关闭更有用。我重复了许多,但有时对OP的具体问题的一些直接解释对每个人都比重复更有用。不幸的是,有一个输入错误,但它是在创建简化版本以便在此处发布时出现的。我添加了catc这就抛出了一个错误,catch不是一个函数。我认为问题是我的其他一些代码仍然依赖于jQuery Deffered,有些代码使用Promise。因此,很高兴知道,如果真的是turtles,那么我所拥有的应该可以用。@Rothrock-好吧,如果你在他里面混合了jQuery Promise和ES6 Promise调用我们无法告诉我们什么是什么,这使得我们很难帮助您。我们还需要知道您使用的jQuery版本,因为有些版本比其他版本更兼容ES6承诺。@Rothrock-您可以使用
Promise.resolve()包装任何jQuery承诺
这将把它们转换成ES6标准承诺,它将与
.catch()
一起使用。例如,
Promise.resolve(firstNetworkCall())。然后(…).catch(…)