我在 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
问题:
- 这段代码可以变得更简洁吗?
- 或者使用更多的 async/await 和更少的 Promise 语法?
- 是否有任何相当于
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/