无序执行的 Promise 链

Promise chain executing out of order

Account.findByOwnerID(userID)
.then(function(account) {
    return validateTo(account, userID);
})
.then(User.findByUsername(email))

在这种情况下,findByOwnerID 会运行,但是一旦其中的 Promise.all() 开始 运行,findByUsername 就会开始执行,跳过 validateTo。

代码中的一个简单更改使一切都按照我的预期工作。

Account.findByOwnerID(userID)
.then(function(account) {
    return validateTo(account, userID);
})
.then(function() {
    return User.findByUsername(email);
})

使用此代码,findByOwnerID 运行,然后在解析时运行 validateTo。解决后,findByUsername 为 运行.

那么为什么这个有效而不是上面的那个呢?我理解承诺链的方式是每个 .then() 都应该得到一个承诺,当它被解决时,将触发下一个 .then()。

所用函数的一些背景(如果需要,我可以提供更多细节)

Account.findByOwnerID 和 User.findByUsername 是 return 承诺的函数。在该承诺中,他们使用 Promise.all.then(function() {resolve()},到 return 主要承诺并继续链。

validateTo 是一个 return 承诺的函数。

这与承诺无关。这是简单的函数调用。

您实际上是在问为什么 a(b()) 的行为与 a(function () { b() }) 不同。简单的答案是,在第一个中,b() 被执行,然后将结果传递给 a(),而在第二个中,a() 执行并传递一个函数,该函数可能会也可能不会在将来的某个时间被调用。

.then(b()) 立即调用 b,并且 return 值(无论可能是什么)被传递到 then。这就是您的第一个案例所做的。

.then(function () { b() }) 将函数传递给 thenthen 决定 when/if 执行该功能。这就是你的第二个案例所做的。