在循环内异步更改对象,然后 return 修改后的对象

change object asynchronously inside a loop and then return the modified object

问题是 "then" 在 "getUsernameById" 完成它在循环中的工作之前触发。

var dummyObject = {
    choices: [
        {
            votes: [
                "1234",
                "2143",
                "4321"
            ]
        }
    ]
};

Promise.each(dummyObject.choices, function(choice, i) {
    dummyObject.choices[i].test = "test"; // this gets changed before 'then'
    Promise.each(choice.votes, function(vote, j) {
        getUsernameById(vote).then(function(username) {
            dummyObject.choices[i].votes[j] = username; // this gets changed after 'then'
        });
    });
}).then(function() {
    res.json(dummyObject);
});

这能做到吗?

这可能对你有用。几乎正在发生的事情是 getUsernameById 是 return 一个承诺,我们在其上调用 thenthen 本身 return 的事实证明了这一点这是一个承诺。所以我们正在做的是针对与每个选择相关的每个投票,我们将一个承诺放入我们的 promises 数组中。在获取用户名并修改正确的投票和选择后,这些承诺中的每一个都得到解决。

然后你可以在 promises 数组上使用 all,return 一个在 promises 数组中的所有 promises 都被 resolved 之后被解析的 promise。你的最后一个 then 只会在所有这些都发生后触发,到这个时候,你的 dummyObject 应该正确更新。

var dummyObject = {
    choices: [
        {
            votes: [
                "1234",
                "2143",
                "4321"
            ]
        }
    ]
};

var promises = [];

dummyObject.choices.forEach(function (choice, i) {
  choice.votes.forEach(function (vote, j) {
    var userPromise = getUsernameById(vote).then(function (username) {
      dummyObject.choices[i].votes[j] = username;
    });

    promises.push(userPromise);        
  });
});

return Promises.all(promises).then(function () {
  res.json(dummyObject);
});

希望这对您有所帮助。如果您有任何问题,请告诉我。