javascript - Promise.all() 决定为每个 Promise 赋予相同的值

标签 javascript node.js promise es6-promise

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

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 的工作原理。

最佳答案

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

var userSpecificOptions = options;

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

相反,您应该获取选项的副本:

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

或者使用对象文字传播:

var userSpecificOptions = {...options};

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

关于javascript - Promise.all() 决定为每个 Promise 赋予相同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46258669/

相关文章:

javascript - 文本输入的 HTML 自动更正功能不起作用

javascript - 为什么我的 Date 克隆在 Travis CI 测试中落后了 1 小时

javascript - Node.js - 向 child_process 发送大对象很慢

node.js - NodeJS 生成 FFMPEG 进程无法正确理解参数

node.js - 在本地主机 : This site can’t be reached 上运行 vue-cli 欢迎页面的 Docker 容器

Javascript - 在构造函数中使用左侧赋值更改对象

javascript - jquery访问没有类名的表单

javascript - Mocha - 测试 Promise, `done` 永远不会在 Promise 中被调用

javascript - 有没有办法在不恢复调试器的情况下评估 nodejs 中的 promise ?

javascript - 使用 sinon 时出现不一致的 UnhandledPromiseRejectionWarning