【发布时间】:2019-01-20 23:35:12
【问题描述】:
假设我想在一个switch块的各个case块中执行不同的promise链,并最终通过res.end()将结果返回给客户端,像这样:
app.post('/endpoint',function(req,res){
var reqValue=req.body.value;
var resValue="initial value";
switch(reqValue){
case 'a':
someObj.action_a()
.then(result=>{
resValue=result.id;
});
break;
case 'b':
someObj.action_b()
.then(result=>{
resValue=result.id;
});
break;
default:
resValue="default";
}
doSomethingElse();
res.end(resValue);
});
最终发生的事情是resValue 返回为"initial value",这是有道理的,因为case 块中的异步函数在执行到达resValue 之前没有更新resValue。我可以将 post-switch 代码移动到这样的承诺解决方案中:
case 'a':
someObj.action_a()
.then(result=>{
resValue=result.id;
doSomethingElse();
res.end(resValue);
});
break;
case 'b':
someObj.action_b()
.then(result=>{
resValue=result.id;
doSomethingElse();
res.end(resValue);
});
break;
default:
resValue="default";
doSomethingElse();
res.end(resValue);
但这是重复代码,因此维护起来更具挑战性。有没有更好的方法让这些switch 介导的承诺都以相同的res.end() 结束?
【问题讨论】:
-
treat this block of code as synchronous- 处理异步代码的危险方法 - use async await 没有其余部分如何:p
标签: javascript node.js promise