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

标签 javascript node.js promise async-await

我在 Node.js 应用程序中有一个场景

场景

  • p1 到 p5 是 promise (在实际代码中,它们调用数据库或 Web 服务)
  • p1, p2 可以立即创建(根据请求参数中的数据)
  • p3, p4 依赖于 p1 获取数据
  • p5 依赖于 p2 获取数据

我想确保没有任何 promise 会不必要地等待。
这意味着 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。使用我的建议可以避免这种情况。

关于javascript - 如何在 Node.js 中使用 async/await 编写依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43347216/

相关文章:

javascript - 节点 promise 和返回值

javascript - 如何使用coffeescript或javascript读取json文件/解析的值以在d3 java脚本中使用

node.js - 除非先删除 node_modules 文件夹,否则 NPM 安装无法正常工作?

node.js - Express 框架和 Promises - 从路由处理程序返回什么?

node.js - 更新 Mongoose 中的模式以添加新属性

node.js - 获取 Mongoose 模型的(关联)数组

javascript - JS — FLIP 技术和 requestAnimationFrame,重构为不嵌套

javascript - 如何在javascript中以所需的格式移动数组中的数据?

javascript - 使用 KendoUI 折线图,如何在类别上附加多个折线标签?

javascript - JSP 和 JavaScript 转换日期