我是Angular的新手,所以以高效的方式编写代码仍然相当困难。我最近遇到了有关Promise链接的问题,我想知道是否有更好的方法可以解决这个问题。
要点是这样的:我有一个函数A,它需要函数B的结果。如果我从函数B中得到某个结果,则我将调用C。B和C都返回Promises。
所以最后我得到了一个非常丑陋的代码块。
funcA(): Promise<MyObj> {
return new Promise(function(resolve, reject) {
funcB().then (res => {
check if res satisfies condition
funcC().then( obj => {
process obj
resolve(obj)
}, reason => doSomething then reject)
}, reason => doSomething then reject)
}
}
该代码可以满足我的需要,但是很难阅读,我认为可能会有更好的方法。由于我需要在许多地方进行类似的呼叫,因此问题变得更糟,有时链接可能更加复杂。因此,如果有人可以提出有关如何更好地重新格式化代码或如何使用Promise链重写功能的建议,我将不胜感激。
答案 0 :(得分:1)
由于您在此处处理承诺,因此可以使用async
await
语法来实现更简洁的实现。与此类似:
async funcA() {
try {
const res = await funcB();
if (check your condition with res) {
const obj = await funcC();
const resolvedObj = resolve(obj); // your custom implementation here;
return resoalvedObj;
}
} catch (error) {
console.log(`Something went wrong. Here's the error: ${JSON.stringify(error)}`);
}
}
注意::这可能不是您应该使用的确切实现。但这绝对是您清理实现的一个很好的起点。
答案 1 :(得分:0)
您可以使用Observables(here is an old answer of mine来说明为什么这样做),但是由于您要答应诺言,所以让我提供一个答案。
处理此问题的最佳方法是将它们完全链接在一起。只要您的then
返回某些内容,就可以像shown here一样使它变得容易。
这将给出:
funcA(): Promise<MyObj> {
return promiseB()
.then(res => promiseC(res))
...
.then(res => promiseZ(res))
);
}