我有常见的情况,但是没有回调方法,我找不到任何解决方案。这是我所拥有的: 从服务方法调用另一个文件中的帮助程序方法,从帮助程序调用执行一系列异步操作的辅助方法的方法。他们彼此依赖。
let myParentPromise = MyService.serviceFunc(in1, in2);
myParentPromise.then(res => console.log(res));
myParentPromise.catch(exc => console.log(exc));
服务层:
serviceFunc: (in1, in2) => {
return new Promise((resolve, reject) => {
//some processing
let helperPromise = MyHelper.helperFunc(in1,in2);
helperPromise.then(res =>
//processing
{resolve(res)});
helperPromise.catch(exc => {reject(exc)})
})
助手层:
helperFunc: (in1, in2) => {
return new Promise((resolve, reject) =>{
resolve(async1);
}).then(res1 =>{
return async2;
}).then(res2 => {
return res2;
})
}
我想将res2传递到我的服务层,然后传递到myParentPromise。
该怎么做? 是否可以在不使用回调的情况下做到这一点?我喜欢单纯地使用诺言来完成这项工作。
任何帮助将不胜感激。
答案 0 :(得分:1)
我建议您看看文档here。
如果您返回承诺,则可以链接。您已经返回了res2
,为了能够在myParentPromise
中获得该值,剩下的唯一内容是:
const finalResult = serviceFunc(in1, in2)
.then(res => res)
.catch(exc => exc);
const serviceFunc = (in1, in2) =>
helperFunc(in1, in2)
.then(res => res)
.catch(exc => exc);
const helperFunc = (in1, in2) => async1.then(res1 => async2).then(res2 => res2);
最后,我建议您阅读有关async/await
的信息,我认为这是对代码库的改进。
[编辑]更新了代码并添加了减少嵌套的示例。
因此,嵌套的问题是使异步代码晦涩难懂,可能错误地捕获错误,甚至更糟,可能会创建与第一个竞争的新的Promise链,对此进行了很好的解释here。
因此,如何避免所有这些:如上例所示,返回promise。其他post很好地解释了为什么它是反模式以及如何解决它:)。
现在,如何减少嵌套?我可以想到两种方法:
请始终记住您正在使用异步代码,并且作为经验法则,始终返回承诺。编码愉快!