在循环内异步更改对象,然后 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 一个承诺,我们在其上调用 then
和 then
本身 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);
});
希望这对您有所帮助。如果您有任何问题,请告诉我。
问题是 "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 一个承诺,我们在其上调用 then
和 then
本身 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);
});
希望这对您有所帮助。如果您有任何问题,请告诉我。