繁体   English   中英

如何在Node.js中使用async / await编写依赖项

[英]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

问题

  1. 这段代码可以变得更干净吗?
  2. 或者使用更多的async / await和更少的Promise语法?
  3. 是否有任何等效的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM