无序执行的 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() })
将函数传递给 then
。 then
决定 when/if 执行该功能。这就是你的第二个案例所做的。
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() })
将函数传递给 then
。 then
决定 when/if 执行该功能。这就是你的第二个案例所做的。