[英]promise chain resolves before its last promise resolves
背景
从2个几乎完全相同的javascript开始,然后重构为3:一个实用程序脚本,其中包含以前的冗余代码+ 2个调用脚本。
问题
这两个原始脚本使用了jQuery Deferreds(when.then),并且运行良好。 3脚本方案失败,因为倒数第二个诺言会从一个调用脚本中尽早解决 。
细节
第一个脚本称为“ multi”,它使用一系列递延操作来循环一系列ajax请求,然后在浏览器中刷新“ multi”页面。 所以:
auth -> user -> loop (updateIssue -> transition) end loop -> refresh
第二个“单个”有效地使用相同的代码而不循环,然后使用不同的refresh
功能
我的目的是将代码重构为实用程序脚本中的promise链,并使用如下代码:
// 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
。 您可以提供的任何见解将最有帮助。
Promise.all调用始终在更新之后但在过渡之前解决
唯一可能发生的方法是,如果事件链中的某些内容未正确链接诺言。 您必须向我们展示真实的代码,以帮助您识别特定的问题,但是,如果Promise.all()
没有等待transition
承诺,则该承诺不能正确地链接到Promise.all()
的承诺数组中Promise.all()
正在等待。
具体来说,我们需要查看伪代码这一部分背后的代码:
array of update.then(transition) promises
确切地了解transition()
是如何创建该诺言数组的。 与往常一样,如果您向我们展示您的REAL代码而不只是伪代码,我们可以帮助您找到编程逻辑中实际错误的根源。
一种可能的情况是,您正在使用JQuery <版本3,并且对authPromise()
的调用将返回JQuery authPromise()
。 这意味着Utility.promiseChain
返回的promise链中then
返回的所有promise都是JQuery Promise。 我上次检查时,较早版本的JQuery不能将外部库的承诺(包括由本地Promise构造函数返回的承诺)识别为承诺,并且可以实现用一个人解决的JQuery承诺,而无需等待其解决。
Promise.all
返回的Promise.all
对象可能
.then(function() { return Promise.all( // ...
被用来履行返回的承诺, then
无需等待它解决。
简而言之,您无法使用ES6 Promise解析旧版本的JQuery Promise,而无法产生通过Promise解决Promise的效果。
潜在的解决方案:
升级到JQuery 3(您失去了对IE的旧版本的支持,但无论如何它们都不支持Promise
)。 推荐(如果可以的话)。
通过调用Promise.resolve( jqPromise)
将所有promise用法转换为ES6样式promise,并将使用前传递给Promise.resolve( jqPromise)
所有JQuery promise转换为
反向编写与Promise.resolve
等效的Promise.resolve
,以将ES6承诺转换为JQuery承诺。 我会尽可能地给它打分,但是会向错误的方向倒退。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.