【问题标题】:Promise chain executing out of order无序执行的 Promise 链
【发布时间】:2016-07-15 22:48:56
【问题描述】:
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。

那么为什么这个行得通而不是上面的那个呢?我理解 Promise 链接的方式是,每个 .then() 都期望得到一个 Promise,当它被解决时,将触发下一个 .then()。

所用函数的一些背景知识(如果需要,我可以提供更多详细信息)

Account.findByOwnerID 和 User.findByUsername 是返回承诺的函数。在这个 Promise 中,他们使用 Promise.all.then(function() {resolve()} 来返回主 Promise 并继续这个链。

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

【问题讨论】:

    标签: javascript promise es6-promise


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我理解正确吗? A() 和 B() 都是返回承诺的函数。 A().then(B()) 将开始运行 A,然后在 A 解决之前立即开始运行 B。如果我运行 A().then(function() { B() } ),B 会等到 A 解决?
    • @Elliot 是的。在前者中,A() 将运行并返回一个 Promise,然后 B() 将被执行,它的 Promise 将作为唯一参数传递给 A 的 Promise 上的 then
    • @Elliot 在后面,A() 运行并返回一个 promise,然后调用其 then 方法并传递一个函数。在 A 的承诺解决之前,该函数不会被执行。
    • 可能更容易理解为什么a(b()) 的行为不同于a(b)
    • 是的@jib,这是一种更简单的思考方式。我花了点心思才明白 meagar 在说什么,但现在一切都说得通了。
    猜你喜欢
    • 2013-09-26
    • 1970-01-01
    • 2020-05-23
    • 2016-08-07
    • 2020-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多