f2和f3依賴于f1的結果,f4依賴于f2和f3的結果,f6依賴于f3和f4和f5的結果?
怎么寫效率最高?
f1
/ \
f2 f3 f5
\ / \ /
f4 \ /
\ \ /
f6f5沒有依賴,所以f5執(zhí)行的越早越有利,尤其是f5響應時間>f4的時候
// 模擬下請求
const timeConsumingFunc = param=>new Promise(
(resolve) => {
let timeout = Math.random() * 5000;
console.log(`task ${param} will be resolved in ${timeout}ms`);
setTimeout(() => {
console.log(`${param} resolved`);
resolve(param+10);
}, timeout);
}
);
console.time('totalTime2');
Promise.all([(()=>{
return timeConsumingFunc(1).then(res1 => {
console.log(`f1 get response: ${res1}`);
return Promise.all([timeConsumingFunc(2),timeConsumingFunc(3)]);
}).then(([res2,res3])=>{
console.log(`f2 get response: ${res2}`);
console.log(`f3 get response: ${res3}`);
return timeConsumingFunc(4);
});
})(),timeConsumingFunc(5)]).then(([res4,res5])=>{
console.log(`f4 get response: ${res4}`);
console.log(`f5 get response: ${res5}`);
return timeConsumingFunc(6);
}).then(res6=>{
console.log(`f6 get response: ${res6}`);
console.timeEnd('totalTime2');
});
最終時間大致=MAX{(f1 + MAX(f2,f3) + f4), f5} + f6
……樓上的各位花式炫技。為什么要把那些依賴關系全都攪和到一起?用幾個變量代價真的那么大么?那些代碼寫出來之后還能維護么?
題主問
怎么寫效率最高?
我相信程序員的效率也算數(shù)的。
const result1 = f1();
const result2 = result1.then(f2);
const result3 = result1.then(f3);
const result4 = Promise.all([result2, result3]).then(f4);
const result5 = f5();
const result6 = Promise.all([result3, result4, result5]).then(f6);
一個依賴關系一行,看到代碼就明白誰依賴誰,而且保證能并行的都并行。依賴關系之間解耦,誰變了只需要改一行代碼。錯誤也能正常拋出。
無法忍受垃圾變量?套到塊級作用域里就行了。
let result;
{
const result1 = f1();
// ...
const result6 = Promise.all([result3, result4, result5]).then(f6);
result = result6;
}
新建塊級作用域的代價幾乎為零,新開6個變量的成本也可以忽略,換來的是可讀性的巨大提升。
評論里有同學懷疑這段代碼的正確性,所以只好創(chuàng)建fiddle來驗證一下。
https://jsfiddle.net/liqi0816...
function sleep(ms, message) {
return new Promise(resolve => setTimeout(() => {
// 1. 輸出點東西,這樣我們就知道進度了
document.body.append(`${message}: ${Date()}`, document.createElement('br'));
// 2. 然后resolve它
resolve(message);
}, ms));
}
const f1 = () => sleep(2000, 'f1');
const f2 = () => sleep(2000, 'f2');
const f3 = () => sleep(2000, 'f3');
const f4 = () => sleep(2000, 'f4');
const f5 = () => sleep(2000, 'f5');
const f6 = () => sleep(2000, 'f6');
const result1 = f1();
// ...
const result6 = Promise.all([result3, result4, result5]).then(f6);
result6.then(message => document.body.append(`end of excution(${message}): ${Date()}`));
結果
f1: Tue Jun 19 2018 18:00:37 GMT+0800 (中國標準時間)
f5: Tue Jun 19 2018 18:00:37 GMT+0800 (中國標準時間)
f2: Tue Jun 19 2018 18:00:39 GMT+0800 (中國標準時間)
f3: Tue Jun 19 2018 18:00:39 GMT+0800 (中國標準時間)
f4: Tue Jun 19 2018 18:00:41 GMT+0800 (中國標準時間)
f6: Tue Jun 19 2018 18:00:43 GMT+0800 (中國標準時間)
end of excution(f6): Tue Jun 19 2018 18:00:43 GMT+0800 (中國標準時間)
回答一下疑問吧
你的代碼能正確執(zhí)行????????
當然能。請不要想當然,做過實驗再懷疑。
result1執(zhí)行多次
.then是沒有副作用的。可能這位同學把f1和result1搞混了。f1只執(zhí)行了一次,result1包裝的是這一次執(zhí)行的結果,不論.then多少次也不會變。
let temp = f1().then(data1 => {
return Promise.all([f2(), f3()])
}).then(([data2, data3]) => {
return Promise.all([f4(), Promise.resolve(data3)])
})
Promise.all([temp, f5()]).then(([[data4, data3], data5]) => {
console.log(data4, data3, data5)
return f6()
}).catch(error=>{
console.log(error)
})北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達內教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構,是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學校辦產業(yè)為響應國家深化產教融合/校企合作的政策,積極推進“中國制造2025”,實現(xiàn)中華民族偉大復興的升級產業(yè)鏈。利用北京大學優(yōu)質教育資源及背
博為峰,中國職業(yè)人才培訓領域的先行者
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經理從事移動互聯(lián)網管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經理職務負責iOS教學及管理工作。
浪潮集團項目經理。精通Java與.NET 技術, 熟練的跨平臺面向對象開發(fā)經驗,技術功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網頁制作和網頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經驗。曾經歷任德國Software AG 技術顧問,美國Dachieve 系統(tǒng)架構師,美國AngelEngineers Inc. 系統(tǒng)架構師。