替代异步标注的承诺?

时间:2017-10-26 22:32:27

标签: javascript angularjs asynchronous promise repository-pattern

假设我们有一个简单的前端和(假设Angular,如果重要的话)和后端应用程序。假设前端应用程序执行get请求。通常,角度存储库会发出一个$http.get请求,它返回一个promise(angular 1)或一个可以转换为promise(angular 2或4)的observable,然后存储库返回该promise。然后角度服务看起来像

repository.makeTheGetCall().then(function (response) {
  // process response
}); 

这通常很好。

1)但是如果服务上的所有逻辑都依赖于这1个呼叫怎么办?然后我们基本上在.then子句中嵌套了整个服务。

2)或者如果基于第一个Get请求的响应,我们再发出一个请求。并根据该响应,我们提出另一个请求,依此类推。然后我们会有一堆链接的条款。

这两种情况似乎都不常见,而且两者都会产生看似“丑陋”的代码。是否有任何其他实践可以用于允许异步调用但不必将promises从存储库层返回到服务层?

谢谢:)

1 个答案:

答案 0 :(得分:4)

您可以使用async/await。它是经典.then()承诺处理的唯一替代方案。

所以,而不是这样做:

someServiceMethod() {
  repository.makeTheGetCall().then(function (response) {
    // process response
  }); 
}

你可以这样做:

async someServiceMethod() {
  const response = await repository.makeTheGetCall()
  // process response
}

最酷的是我们没有任何“回调地狱”的起点,代码现在是平的(列表中排名第1)

此外,如果其中一个Promise被拒绝,我们可以处理try/catch块中的错误。关于它的好处是我们可以有一个地方来捕捉所有错误。 (列表中的#2):

async someServiceMethod() {
  try {  
    const response = await repository.makeTheGetCall()
    const data = await repository.getDataForResponse(response)
    // process data or make another async call
  } catch (err) {
    // process error
  }
}

Good explanation of how to use it