1 回答
TA贡献1776条经验 获得超12个赞
让我们看一下使用超时来模拟您的异步调用。
在您进行优化之前,此代码等效于您的第一个示例。请注意在任何给定时刻只有一个承诺待处理:
let serializeAndCache = owner => {
console.log(`Starting: ${owner}`);
let prm = new Promise(r => setTimeout(r, 2000));
prm.then(() => console.log(`Finished: ${owner}`));
return prm;
};
let project = {
rows: [
{
owner: 'owner1',
collaborators: [
{ name: null, email: 'collab1@row1.com' },
{ name: null, email: 'collab2@row1.com' },
{ name: null, email: 'collab3@row1.com' },
{ name: null, email: 'collab4@row1.com' }
]
},
{
owner: 'owner2',
collaborators: [
{ name: null, email: 'collab1@row2.com' },
{ name: null, email: 'collab2@row2.com' },
{ name: null, email: 'collab3@row2.com' },
{ name: null, email: 'collab4@row2.com' }
]
},
{
owner: 'owner3',
collaborators: [
{ name: null, email: 'collab1@row3.com' },
{ name: null, email: 'collab2@row3.com' },
{ name: null, email: 'collab3@row3.com' },
{ name: null, email: 'collab4@row3.com' }
]
}
]
};
(async () => {
for (let row of project.rows) {
row.owner = await serializeAndCache(row.owner);
for (let collaborator of row.collaborators) {
let c = await serializeAndCache(collaborator.email);
if (!c) continue;
collaborator.name = c.name;
delete collaborator.role;
}
}
})();
这段代码相当于你的优化版本:
let serializeAndCache = owner => {
console.log(`Starting: ${owner}`);
let prm = new Promise(r => setTimeout(r, 2000));
prm.then(() => console.log(`Finished: ${owner}`));
return prm;
};
let project = {
rows: [
{
owner: 'owner1',
collaborators: [
{ name: null, email: 'collab1@row1.com' },
{ name: null, email: 'collab2@row1.com' },
{ name: null, email: 'collab3@row1.com' },
{ name: null, email: 'collab4@row1.com' }
]
},
{
owner: 'owner2',
collaborators: [
{ name: null, email: 'collab1@row2.com' },
{ name: null, email: 'collab2@row2.com' },
{ name: null, email: 'collab3@row2.com' },
{ name: null, email: 'collab4@row2.com' }
]
},
{
owner: 'owner3',
collaborators: [
{ name: null, email: 'collab1@row3.com' },
{ name: null, email: 'collab2@row3.com' },
{ name: null, email: 'collab3@row3.com' },
{ name: null, email: 'collab4@row3.com' }
]
}
]
};
(async () => {
await Promise.all(project.rows.map(async row => {
row.owner = await serializeAndCache(row.owner);
return Promise.all(row.collaborators.map(async collab => {
let c = await serializeAndCache(collab.email);
if (c) {
collab.name = c.name;
delete collab.role;
}
}));
}));
})();
如您所见,许多 Promise 都同时处于待处理状态(总体而言,代码完成得更快)。您的优化似乎奏效了!我只能假设背后的任何逻辑serializeAndCache在同时被许多调用淹没时表现不佳。这似乎是性能不佳的唯一解释。
添加回答
举报
