我对nodejs还是个新手,对我来说,承诺似乎有点难以理解。我有一个需求,其中我有一个对象数组(假设来自数据库的大数据)。我需要遍历每个数据,并对该特定数据并行地执行两个异步操作(数据库操作)。
下面是所附的示例片段。
const data = [
{
"id": 1
},
{
"id": 2
},
{
"id": 3
},
{
"id": 4
},
{
"id": 5
}
];
(async () => {
const first = async(id) => {
// db operation
return new Promise(resolve => setTimeout(() => {
console.log("first", id);
resolve();
}, 100 * Math.random()));
};
const second = async(id) => {
// db operation
return new Promise(resolve => setTimeout(() => {
console.log("second", id);
resolve();
}, 100 * Math.random()));
};
const promiseResp = data.map(async(d) => {
await first(d.id);
await second(d.id);
});
await Promise.all(promiseResp);
})();
响应获取:
first 5
first 3
second 5
first 4
first 2
first 1
second 3
second 2
second 4
second 1
我希望代码可以并行运行相同的数据。但得到的回应并不是我所期望的那样。我的期望是相同的id,首先执行&;其次,并行异步操作,并在移动到下一个对象之前提供输出。我们怎样才能做到这一点呢?
有人能让我知道我失踪的地方吗?如有任何帮助,我们将不胜感激?
编辑:还有,我们如何执行所有数据的并行操作?
要并行运行first
和second
,您不会使用await
,而是使用
const promises = data.map(d =>
Promise.all([
first(d.id),
second(d.id),
])
);
await Promise.all(promises);
在移动到下一个对象之前提供输出
为此,您不能使用data.map
,而是使用等待
每个对象的结果的顺序循环:
for (const d of data) {
await Promise.all([
first(d.id),
second(d.id),
]);
}