【问题标题】:promise chain resolves before its last promise resolves承诺链在其最后一个承诺解决之前解决
【发布时间】:2017-11-23 00:27:44
【问题描述】:

背景
从 2 个几乎相同的 javascript 开始,然后重构为 3 个:一个包含以前冗余代码的实用程序脚本 + 2 个调用脚本。

问题
两个原始脚本使用 jquery Deferreds (when.then) 并且工作正常。 3 脚本方案失败,因为倒数第二个 promise 提前解决来自一个调用脚本。

详情
第一个脚本,称为“multi”,使用一系列 deferreds 循环一系列 ajax 请求,然后刷新浏览器中的“multi”页面。所以:

auth -> user -> loop (updateIssue -> transition) end loop -> refresh

第二个,“single”有效地使用相同的代码,没有循环,然后使用不同的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。您可以提供的任何见解都将是最有帮助的。

【问题讨论】:

  • 能否请您显示创建update.then(transition) 承诺数组的代码,transition onFullfilled 处理程序的作用以及您使用的 JQuery 版本 - 版本 1 和 2 不符合承诺标准并且在准确处理原生 Promise 方面存在问题。
  • 另外,除了版本之外,authPromiseuserPromise返回的promise是什么样的,ES6还是JQuery?

标签: javascript jquery promise


【解决方案1】:

Promise.all 调用总是在更新之后,但在转换之前解决

唯一可能发生的情况是,如果您的事件链中的某些内容没有正确链接承诺。您必须向我们展示真正的代码,以便我们帮助您识别具体问题,但如果 Promise.all() 没有等待 transition 承诺,则该承诺不能正确链接到 @987654323 的承诺数组中@ 正在等待。

具体来说,我们需要看看你这部分伪代码背后的代码:

array of update.then(transition) promises

看看transition() 是如何参与创建这个promise 数组的。 与往常一样,如果您向我们展示您的真实代码而不仅仅是伪代码,我们可以帮助您找到编程逻辑中实际错误的根源。

【讨论】:

  • @varontron - 你的问题得到解答了吗?
【解决方案2】:

一种可能的情况是,您使用的是 JQuery authPromise() 的调用返回一个 JQuery 承诺。这意味着thenUtility.promiseChain 返回的承诺链中返回的所有承诺都是JQuery 承诺。上次我检查时,旧版本的 JQuery 不识别外部库承诺,包括那些由本地 Promise 构造函数返回的承诺,并且会履行一个 JQuery 承诺,而不用等待它被解决解决了。​​

有可能是Promise.all中返回的promise对象

.then(function() { return Promise.all( // ...

正在用于履行then返回的承诺,而无需等待它被解决。

简而言之,您无法使用 ES6 承诺解决旧版本的 JQuery 承诺,并产生使用承诺解决承诺的效果。

可能的解决方案:

  1. 升级到 JQuery 3(您将失去对旧版本 IE 的支持,但这些不支持 Promise)。可以的话推荐。

  2. 通过调用Promise.resolve( jqPromise)

  3. ,将所有的promise用法转换为ES6风格的promise,并在使用前将所有被传递的JQuery promises转换为ES6 promises
  4. 反向编写 Promise.resolve 的等效项以将 ES6 承诺转换为 JQuery 承诺。我会尽可能地评价这一点,但在错误的方向上是一个巨大的倒退。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-24
    • 2021-08-11
    • 2019-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-23
    相关资源
    最近更新 更多