Javascript 如何在Node.js中使用async/await编写依赖项
我在Node.js应用程序中有一个场景 脚本Javascript 如何在Node.js中使用async/await编写依赖项,javascript,node.js,promise,async-await,Javascript,Node.js,Promise,Async Await,我在Node.js应用程序中有一个场景 脚本 p1到p5是承诺(在实际代码中,他们称之为数据库或web服务) p1、p2可以立即创建(从请求参数中的数据) p3、p4取决于数据的p1 p5取决于数据的p2 我想确保没有不必要的承诺等待。 这意味着一旦p1解析,就会创建p3和p4 同样地,p2一解析,p5就被创建 已为此创建JSBin: 问题: 这个代码能变得更干净吗 还是更多地使用async/await而少使用Promise语法 有(回调世界)的等价物吗 //无保护 const start
是承诺(在实际代码中,他们称之为数据库或web服务)p1到p5
p1、p2可以立即创建(从请求参数中的数据)
取决于数据的p3、p4
p1
取决于数据的p5
p2
这意味着一旦p1解析,就会创建p3和p4
同样地,p2一解析,p5就被创建 已为此创建JSBin: 问题:
//无保护
const startTime=Date.now();
常量日志=(…a)=>{
让timeDiff=Date.now()-startTime;
log(timeDiff+':'+a.join(“”));
};
const createPromise=(标记,时间)=>{
日志(标记“已创建”,时间);
返回新承诺((解决)=>{
setTimeout(解析,时间);
})
.然后(()=>{
日志(标记“点火”,时间);
});
};
/*
*情景
*p1、p2是独立的承诺
*p3、p4依赖p1获取数据
*p5依赖p2获取数据
*/
异步函数fn(){
设p1=createPromise('p1',200);
设p2=createPromise('p2',50);
设p3,p4,p5;
p1.然后(()=>{
p3=createPromise('p3',1000);
p4=createPromise('p4',500);
});
p2.然后(()=>{
p5=createPromise('p5',300);
});
等待承诺。所有([p1,p2]);
日志(“正在等待p3、p4、p5”);
等待承诺。所有([p3,p4,p5]);
日志(“所有已解决”);
}
fn()代码>
JS-Bin
关于第一个问题,我建议您执行以下操作:
...
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!换句话说,p3不应该与p4有直接关系,最终会影响p4。可以避免使用我的建议。关于第一个问题,我建议您执行以下操作:
...
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!换句话说,p3不应该与p4有直接关系,最终会影响p4。可以避免使用我的建议。我喜欢你的建议。它允许我在开始时初始化p3、p4、p5
变量,以便我可以直接等待它们。我不确定是否有错误,我得试着把整个事情都搞清楚。不过,我正在寻找更多的async/await语法或类似的async.auto
。我喜欢你的建议。它允许我在开始时初始化p3、p4、p5
变量,以便我可以直接等待它们。我不确定是否有错误,我得试着把整个事情都搞清楚。不过,我正在寻找更多的async/await语法或类似的async.auto
。