[英]How to write dependencies using async/await in Node.js
我在Node.js應用程序中有一個場景
p1 to p5
是promises(在實際代碼中他們稱為數據庫或Web服務) p1, p2
可以立即創建(來自請求參數中的數據) p3, p4
取決於p1
的數據 p5
取決於數據的p2
我想確保沒有承諾不必等待。
這意味着只要p1結算就會創建p3,p4
類似地,p2一解析就會創建p5
為此創建了一個JSBin: https ://jsbin.com/ruyozes/edit?js,console
問題 :
async.auto
(回調世界) // noprotect const startTime = Date.now(); const log = (...a) => { let timeDiff = Date.now() - startTime; console.log(timeDiff + ': ' + a.join(' ')); }; const createPromise = (tag, time) => { log(tag, 'created', time); return new Promise((resolve) => { setTimeout(resolve, time); }) .then(() => { log(tag, 'fired', time); }); }; /* * Scenario * p1, p2 are independent promises * p3, p4 depend on p1 for data * p5 depends on p2 for data */ async function fn() { let p1 = createPromise('p1', 200); let p2 = createPromise('p2', 50); let p3, p4, p5; p1.then(() => { p3 = createPromise('p3', 1000); p4 = createPromise('p4', 500); }); p2.then(() => { p5 = createPromise('p5', 300); }); await Promise.all([p1, p2]); log('Waiting on p3, p4, p5 now'); await Promise.all([p3, p4, p5]); log('All resolved'); } fn();
<!DOCTYPE html> <html> <head> <meta name="description" content="Dependency tree with async/await"> <meta charset="utf-8"> <meta name="viewport" content="width=device-width"> <title>JS Bin</title> <script src='https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.23/browser-polyfill.min.js'></script> </head> <body> </body> </html>
關於第一個問題,我建議你做以下事情:
...
async function fn() {
const p1 = createPromise('p1', 200);
const p2 = createPromise('p2', 50);
const p3 = p1.then(() => createPromise('p3', 1000));
const p4 = p1.then(() => createPromise('p4', 500));
const p5 = p2.then(() => createPromise('p5', 300));
await Promise.all([p3, p4, p5]);
log('All resolved');
}
...
為什么? 更嚴格,您的代碼可能會導致不必要的問題。 想象一下, p3 = createPromise('p3', 1000);
拋出錯誤,這種情況會導致什么結果?
p1.then(() => {
p3 = createPromise('p3', 1000); // what if this line throws an error?
p4 = createPromise('p4', 500); // this line will not be excecuted!
});
如果它發生,你甚至不會創建p4! 換句話說,不應該與p4直接關系的p3最終會影響p4。 使用我的建議可以避免這種情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.