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