Javascript Promise.all()解析为每个承诺提供相同的值

Javascript Promise.all()解析为每个承诺提供相同的值,javascript,node.js,promise,es6-promise,Javascript,Node.js,Promise,Es6 Promise,我正在编写一个模块,它有一个函数,可以使用promise.all()向多个用户发送电子邮件来返回承诺。剥离代码后,我能够将问题复制到以下代码段: var getPromise = function(data) { return new Promise((resolve, reject) => { console.log("After Calling:\t\t", data.user); setTimeout(function() {

我正在编写一个模块,它有一个函数,可以使用
promise.all()
向多个用户发送电子邮件来返回承诺。剥离代码后,我能够将问题复制到以下代码段:

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' } ]
但是,切换
用户特定选项的声明

        // var userSpecificOptions = options;
        var userSpecificOptions = {};
var userSpecificOptions = Object.assign({}, options);
获取正确的结果:

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' } ]

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

您使所有
用户特定选项
实例都引用相同的
选项
对象:

var userSpecificOptions = options;
因此,当您分配给
userspecificpoptions.user
时,实际上您修改了
选项

相反,您应该复制一份
选项

        // var userSpecificOptions = options;
        var userSpecificOptions = {};
var userSpecificOptions = Object.assign({}, options);
或使用对象文字排列:

var userSpecificOptions = {...options};

然后,对特定的
userspecificpoptions
对象的任何更改都不会影响
options
或任何其他变量。

您使所有
userspecificpoptions
实例引用相同的
选项
对象:

var userSpecificOptions = options;
因此,当您分配给
userspecificpoptions.user
时,实际上您修改了
选项

相反,您应该复制一份
选项

        // var userSpecificOptions = options;
        var userSpecificOptions = {};
var userSpecificOptions = Object.assign({}, options);
或使用对象文字排列:

var userSpecificOptions = {...options};

然后,对特定的
用户特定选项
对象的任何更改都不会影响
选项
或任何其他变量。

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

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