承诺在Angular中返回

时间:2018-11-19 11:12:29

标签: angular typescript promise angular-promise

我是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链重写功能的建议,我将不胜感激。

2 个答案:

答案 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))
   );
}