作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我想在一个switch
block 的各个case
block 中执行不同的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
block 中的异步函数在执行到达 res.end()
之前不更新 resValue
。我可以将 post-switch
代码移动到这样的 promise 解决方案中:
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
为中介的 promise 都以相同的 res.end()
结束?
最佳答案
您可以像这样使用单个变量来保持所需 resValue 的 promise
app.post('/endpoint',function(req,res){
let reqValue=req.body.value;
let p;
switch(reqValue){
case 'a':
p = someObj.action_a().then(result => result.id);
break;
case 'b':
p = someObj.action_b().then(result => result.id);
break;
default:
// p has to be a promise, so make it one
p = Promise.resolve("default");
}
p.then(resValue => {
doSomethingElse();
res.end(resValue);
});
});
或者使用现代 javascript,使用 async/await
app.post('/endpoint',async function(req,res){
let reqValue=req.body.value;
let resValue="initial value";
switch(reqValue){
case 'a':
resValue = await someObj.action_a().then(result => result.id);
break;
case 'b':
resValue = await someObj.action_b().then(result => result.id);
break;
default:
resValue = "default";
}
doSomethingElse();
res.end(resValue);
});
关于javascript - 如何在 switch block 的每种情况下解决不同的 promise 并将其结果传递给同一函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54281977/
我是一名优秀的程序员,十分优秀!