背景
从两个几乎相同的javascripts开始,然后将其重构为3:一个包含以前冗余代码+2个调用脚本的实用脚本。
问题
这两个原始脚本使用(when.then)并正常工作。3脚本场景失败,因为下一个承诺从一个调用脚本解决早期问题。
详细信息
第一个脚本称为“多”,它使用一系列延迟来循环一系列ajax请求,然后在浏览器中刷新“多”页面。所以:
auth -> user -> loop (updateIssue -> transition) end loop -> refresh
第二,“单”在没有循环的情况下有效地使用相同的代码,然后使用不同的refresh
函数。
我的目标是在实用程序脚本中将代码重构为一个承诺链,并使用如下所示:
// calling script
Utility.promiseChain().done(refresh())
// utility script
Utility.promiseChain = function() {
return authPromise()
.then(function() { return userPromise();} )
.then(function() { return Promise.all(array of update.then(transition) promises);})}
问题,更确切地说是
Promise.all调用总是在update
之后,但在transition
之前解析,这会导致refresh
提前触发,然后是transition
。任何你能提供的洞察力将是最有帮助的。
发布于 2017-11-23 00:32:08
Promise.all调用总是在更新后但在转换之前解析。
唯一可能发生的方法是,如果事件链中的某些事情没有正确地链接承诺。您必须向我们展示真正的代码,以帮助您识别特定的问题,但是如果Promise.all()
没有等待transition
承诺,那么这个承诺就不能正确地链接到Promise.all()
正在等待的承诺数组中。
具体来说,我们需要看到伪代码的这一部分背后的代码:
array of update.then(transition) promises
要确切地了解transition()
是如何参与创建这一系列承诺的。与往常一样,如果您向我们展示的是真正的代码,而不仅仅是伪代码,我们可以帮助我们在编程逻辑中找到实际错误的来源。
发布于 2017-11-23 02:45:20
一个可能的情况是,您使用的是JQuery < version 3,而对authPromise()
的调用将返回一个JQuery承诺。这意味着then
在Utility.promiseChain
返回的承诺链中返回的所有承诺都是JQuery承诺。上一次我检查时,较早版本的JQuery不将外部库承诺(包括本机诺言构造函数返回的承诺)视为承诺,将履行--一个JQuery承诺--无需等待解决即可解决。
中的Promise.all
返回的允诺对象
.then(function() { return Promise.all( // ...
正在被用来履行then
的承诺,而不等待它得到解决。
简而言之,您无法用JQuery承诺解决旧版本的ES6承诺,并产生用承诺解决承诺的效果。
可能的解决办法:
Promise
)。如果你能做到的话。Promise.resolve( jqPromise)
将正在传递的所有JQuery承诺转换为ES6承诺Promise.resolve
反向写入,将ES6承诺转换为JQuery承诺。我认为这是可能的,但一个巨大的倒退错误的方向。https://stackoverflow.com/questions/47445821
复制相似问题