繁体   English   中英

承诺链在最后一个承诺解决之前就解决了

[英]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的效果。

潜在的解决方案:

  1. 升级到JQuery 3(您失去了对IE的旧版本的支持,但无论如何它们都不支持Promise )。 推荐(如果可以的话)。

  2. 通过调用Promise.resolve( jqPromise)将所有promise用法转换为ES6样式promise,并将使用前传递给Promise.resolve( jqPromise)所有JQuery promise转换为

  3. 反向编写与Promise.resolve等效的Promise.resolve ,以将ES6承诺转换为JQuery承诺。 我会尽可能地给它打分,但是会向错误的方向倒退。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM