promise.all对变量做了什么?

时间:2016-06-26 14:18:25

标签: javascript node.js

User.save()是一个带有承诺的函数

这将返回一个对象:

user = user.save();
return sequelize.Promise.all([user, ...])
    .then((results) => {
        console.log(results[0])
    })

但这会返回一个承诺:

return sequelize.Promise.all([user, name, fbprofile, phone])
    .then(()=> {
        console.log(user)
    })

我想使用第一个,因为我想在一个单一的承诺链中使用它:

return sequelize.Promise.all([user, name, fbprofile, phone])
    .then(user.addUserAttributes([name, fbprofile, phone]))
    .then...

2 个答案:

答案 0 :(得分:1)

您的代码

return sequelize.Promise.all([user, name, fbprofile, phone])
  .then(user.addUserAttributes([name, fbprofile, phone]))
  .then...

将在评估语句时调用user.addUserAttributes,这不是您想要的,并且无论如何都不会起作用,因为name等将不会被定义。您想将函数处理程序传递给then。该函数将一个参数数组作为参数,解析传递给Promise.all的每个承诺的结果,您可以在其中解构,如下面的代码所示。然后在函数体中调用addUserAttributes方法。

return sequelize.Promise.all([user, name, fbprofile, phone]) .
  then([user, name, fbprofile, phone]) =>
    user.addUserAttributes(name, fbprofile, phone)
  );

以上假设不仅user,而且namefbprofilephone都是承诺。如果不是这种情况,并且只有user是承诺,那么就没有理由使用Promise.all。你可以写:

return user .
  then(user => user.addUserAttributes(name, fbprofile, phone));

你已经完成了。

我还假设user#addUserAttributes获取参数列表,而不是单个数组参数;如果不是这种情况,请根据需要进行调整。

顺便说一下,你说:

  

这将返回一个对象:

    user = user.save();
    return sequelize.Promise.all([user, ...])
        .then((results) => {
            console.log(results[0])
        })

实际上,假设“返回”是指return语句返回的值,而不是console.log打印的值,确实返回一个承诺(解析为未定义,因为then处理程序不返回任何内容),一个对象。

最后,你问题的标题

  

promise.all对变量做了什么?

很奇怪,可能反映出你的困惑。 Promise.all对任何变量都不做任何事情。它只是评估一个承诺,它将在所有指定的承诺履行时实现,其履行的价值是各个履行值的数组。

答案 1 :(得分:-1)

简单地将promise all等待在执行之前加载的数组中的所有变量。使用它时应小心,因为它相对较新,并且在移动设备上得不到很好的支持。