Promise 链无序执行
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 是一个返回承诺的函数。
这与承诺无关。这是简单的函数调用。
您实际上是在问为什么
a(b())
的行为与
a(function () { b() })
不同。简单的答案是,在第一个中,执行
b()
,然后将结果传递给
a()
,而在第二个中,执行
a()
并传递一个函数,该函数可能会在将来的某个时间点调用,也可能不会调用。
.then(b())
立即调用
b
,并将返回值(无论是什么)传递到
then
。这是您的第一个案例所做的。
.then(function () { b() })
将一个函数传递到
then
。由
then
决定何时/是否执行该函数。这就是您的第二个案例所做的。