javascript - 如何在 switch 块的每种情况下解决不同的承诺并将它们的结果传递给相同的函数?
问题描述
假设我想在case
一个区块的各个区块中执行不同的promise链switch
,并最终通过 将结果返回给客户端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
res.end()
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()
?
解决方案
您可以使用单个变量来保持所需 resValue 的承诺,就像这样
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);
});
推荐阅读
- firebase - 如何设置 Firebase 规则版本 2 和 getDocuments()
- mysql - 如何使用谷歌控制台连接到谷歌 SQL 上的 MySQL 实例?
- visual-studio-code - 如何将我的本地 VSCode 连接到在其上运行 2016 Datacenter 的远程 Windows Server 以进行远程开发?
- wordpress - 如何在以前的运输方式的基础上创建另一种运输方式
- node.js - 如何用 Jest 断言数据类型
- tensorflow - 层 conv2d_30 的输入 0 与层不兼容:预期 ndim=4,发现 ndim=3。收到的完整形状:[None, 621, 2]
- ios - “它没有返回 0,并且 errno 设置为 22”是什么意思?
- c# - 有没有比这更好的方法来创建角色选择和生成器?
- java - 未使用该字段的值
- javascript - 选择桌面捕获源时是否有 Chromium 标志来自动选择共享音频?