开发者问题收集

Promise 链无序执行

2016-03-28
1495
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 是返回承诺的函数。在该承诺中,它们使用 Promise.all.then(function() {resolve()},返回主承诺并继续链。

validateTo 是一个返回承诺的函数。

1个回答

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

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

.then(b()) 立即调用 b ,并将返回值(无论是什么)传递到 then 。这是您的第一个案例所做的。

.then(function () { b() }) 将一个函数传递到 then 。由 then 决定何时/是否执行该函数。这就是您的第二个案例所做的。

user229044
2016-03-28