【问题标题】:Promise.all() resolves to give the same value for each promisePromise.all() 解析为每个 Promise 赋予相同的值
【发布时间】:2019-09-02 23:08:32
【问题描述】:

我正在编写一个模块,该模块具有使用Promise.all() 向多个用户发送电子邮件的功能。剥离代码,我能够将问题重现到以下 sn-p:

var getPromise = function(data) {
    return new Promise((resolve, reject) => {
        console.log("After Calling:\t\t", data.user);
        setTimeout(function() {
                console.log("While Resolving:\t", data.user);
                return resolve(data);
            },
            Math.random() * 1000);
    });
}

var getAllPromises = function(users, options) {
    var promises = [];
    users.forEach(user => {
        var userSpecificOptions = options;
        // var userSpecificOptions = {};
        userSpecificOptions.user = user;
        promises.push(getPromise(userSpecificOptions));
    });
    return Promise.all(promises);
}

var userlist = ["help", "promises", "are", "tough"];
var commonoptions = {
    str: "something",
}

getAllPromises(userlist, commonoptions)
    .then(data => console.log("Data:\n", data))

这给了我以下输出:

After Calling:       help
After Calling:       promises
After Calling:       are
After Calling:       tough
While Resolving:     tough
While Resolving:     tough
While Resolving:     tough
While Resolving:     tough
Data:
 [ { str: 'something', user: 'tough' },
  { str: 'something', user: 'tough' },
  { str: 'something', user: 'tough' },
  { str: 'something', user: 'tough' } ]

但是,将声明切换为userSpecificOptions

        // var userSpecificOptions = options;
        var userSpecificOptions = {};

得到正确的结果:

After Calling:       help
After Calling:       promises
After Calling:       are
After Calling:       tough
While Resolving:     help
While Resolving:     promises
While Resolving:     are
While Resolving:     tough
Data:
 [ { user: 'help' },
  { user: 'promises' },
  { user: 'are' },
  { user: 'tough' } ]

可能是什么问题?我觉得关于 Promise 的工作原理,我可能遗漏了一些东西。

【问题讨论】:

    标签: javascript node.js promise es6-promise


    【解决方案1】:

    您让所有userSpecificOptions 实例引用同一个options 对象:

    var userSpecificOptions = options;
    

    因此,当您分配给userSpecificOptions.user 时,您实际上修改了options

    相反,您应该复制一份options

    var userSpecificOptions = Object.assign({}, options);
    

    或者使用对象字面量传播:

    var userSpecificOptions = {...options};
    

    那么对该特定userSpecificOptions 对象的任何更改都不会影响options 或任何其他变量。

    【讨论】:

      【解决方案2】:

      这个问题不在promise中。在 Javascript 中,对象是通过引用传递的。这意味着在这种情况下,您总是更改同一个对象,并且最后一次更改发生并且您看到所有相同的结果。它在创建新对象而不是修改存在对象时正常工作。

      【讨论】:

        猜你喜欢
        • 2015-11-29
        • 2016-04-30
        • 2021-09-12
        • 1970-01-01
        • 2016-06-21
        • 1970-01-01
        • 2015-06-03
        • 2018-02-06
        相关资源
        最近更新 更多