1 回答

TA貢獻1776條經(jīng)驗 獲得超12個贊
讓我們看一下使用超時來模擬您的異步調(diào)用。
在您進行優(yōu)化之前,此代碼等效于您的第一個示例。請注意在任何給定時刻只有一個承諾待處理:
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;
}
}
})();
這段代碼相當于你的優(yōu)化版本:
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 都同時處于待處理狀態(tài)(總體而言,代碼完成得更快)。您的優(yōu)化似乎奏效了!我只能假設(shè)背后的任何邏輯serializeAndCache
在同時被許多調(diào)用淹沒時表現(xiàn)不佳。這似乎是性能不佳的唯一解釋。
添加回答
舉報