假设我们有一个简单的前端和(假设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从存储库层返回到服务层?
谢谢:)
答案 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
}
}