承诺链不按顺序执行

时间:2016-03-28 16:22:59

标签: javascript promise es6-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的函数。在这个承诺里面,他们使用Promise.all.then(function(){resolve()}来返回主承诺并继续链。

validateTo是一个返回promise的函数。

1 个答案:

答案 0 :(得分:7)

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

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

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

.then(function () { b() })将函数传递给then。最多then决定何时/是否执行该功能。这是你的第二个案例。