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的函数。在这个承诺里面,他们使用Promise.all.then(function(){resolve()}来返回主承诺并继续链。
validateTo是一个返回promise的函数。
答案 0 :(得分:7)
这与承诺无关。这是简单的函数调用。
您有效地问为什么a(b())
的行为与a(function () { b() })
不同。简单的答案是,在第一个中,b()
被执行,然后结果传递给a()
,而在第二个,a()
执行并传递一个函数,可能会也可能不会在将来的某个时候被引用。
.then(b())
立即调用b
,并将返回值(无论可能是什么)传递到then
。这是你的第一个案例。
.then(function () { b() })
将函数传递给then
。最多then
决定何时/是否执行该功能。这是你的第二个案例。