【发布时间】:2018-10-30 18:44:36
【问题描述】:
我需要一些关于我的 Angular 6 项目的建议和最佳实践技巧。
您可以在下面看到一些伪代码(请忽略任何拼写错误),但这基本上就是正在发生的事情。该项目通过几个步骤来获取新的和新鲜的数据并在向用户展示之前对其进行处理。 我想要做的是让它通过所有步骤 1 直到它完成,然后进入步骤 2,一旦完成它就进入步骤 3,依此类推。 这是因为某些步骤需要上一步的响应才能提出请求,这意味着我需要等待每个步骤完成,然后再继续下一步。 但是我对异步函数有一点问题。
var token;
mainFunction(){
step1();
console.log("Done with step 1");
step2();
console.log("Done with step 2");
step3();
console.log("Done with step 3");
}
step1(){
console.log("Step 1...");
var data1 = getData();
// Does things with data1
}
step2(){
console.log("Step 2...");
var data2 = getData();
// Does things with data2
}
step3() {
console.log("Step 3...");
var data3 = getData();
// Does things with data3
}
async getData(){
await getAccessToken();
var result;
console.log("Getting data...");
// Makes a request to an API.
this.http.post("URL", token)
.map(response => response.json())
.toPromise()
.then((response: any) => {
console.log("Got the data!");
// Processing the response
result = response;
}
return result;
}
async getAccessToken(){
console.log("Getting access token...");
let accessToken = await getToken(); //Returns a Promise
this.token = accessToken;
console.log("Got the token!");
return Promise.resolve(true);
}
问题始于 getAccessToken 函数中的 getToken()。这是一个返回承诺的异步函数,这意味着它不等待响应。没问题,设置一个 await 就可以了!
但是即使 getAccessToken() 现在等待 getToken() 完成,getData() 也不会等待 getAccessToken() 完成等待 getToken()。解决方案?我返回了一个 Promise 并将 await 放入 getData() 中。 但是我没有解决我只是移动它的问题。
现在 getData() 在执行请求之前等待 accessToken 完成,但 step1、step2 和 step 3 不会等待。 解决方案是一直返回承诺并在每个函数上设置等待吗?我希望有一种更简洁的方法来做到这一点,只需将 await 设置在它实际需要等待的地方,一切都会停止并等待它完成。
有没有一种干净的方法可以做到这一点?什么是最佳做法?
这是我想要的输出:
- 第 1 步...
- 正在获取访问令牌...
- 得到令牌!
- 正在获取数据...
- 得到数据!
- 步骤 1 完成
- 第 2 步...
- 正在获取访问令牌...
- 得到令牌!
- 正在获取数据...
- 得到数据!
- 第 2 步完成
- 第三步...
- 正在获取访问令牌...
- 得到令牌!
- 正在获取数据...
- 得到数据!
- 完成第 3 步
这是我得到的输出:
- 第 1 步...
- 正在获取访问令牌...
- 步骤 1 完成
- 第 2 步...
- 正在获取访问令牌...
- 第 2 步完成
- 第三步...
- 正在获取访问令牌...
- 完成第 3 步
- 得到令牌!
- 正在获取数据...
- 得到数据!
- 得到令牌!
- 正在获取数据...
- 得到数据!
- 得到令牌!
- 正在获取数据...
- 得到数据!
【问题讨论】:
标签: javascript typescript asynchronous async-await angular6