Мне нужны некоторые предложения в моем угловом проекте 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);
}
Проблема началась с getToken () внутри функции getAccessToken. Это асинхронная функция, которая возвращает обещание, что означает, что оно не ожидает ответа. Нет проблем, просто установите ожидание, и оно отлично работает!
Но даже если getAccessToken () теперь ожидает завершения getToken (), getData () не ждет, пока getAccessToken () завершит ожидание getToken (). Решение? Я вернул Promise и поместил await в getData ().
Но я не решил проблему, я только переместил это.
Сейчас getData () теперь ожидает завершения accessToken, прежде чем выполнять запрос, но step1, step2 и step 3 не ждут.
Является ли решение вернуть обещание полностью и установить ожидание для каждой функции? Я надеюсь, что есть более чистый способ сделать это и просто установить ожидание, где он действительно должен ждать, и все остановится и будет ждать, пока это не закончится.
Есть ли чистый способ сделать это? Что такое лучшая практика?
Это вывод, который я хочу:
- Шаг 1 ...
- Получение токена доступа ...
- Получил жетон!
- Получение данных ...
- Получил данные!
- Готово с шагом 1
- Шаг 2 ...
- Получение токена доступа ...
- Получил жетон!
- Получение данных ...
- Получил данные!
- Готово с шагом 2
- Шаг 3 ...
- Получение токена доступа ...
- Получил жетон!
- Получение данных ...
- Получил данные!
- Готово с шагом 3
Это вывод, который я получаю:
- Шаг 1 ...
- Получение токена доступа ...
- Готово с шагом 1
- Шаг 2 ...
- Получение токена доступа ...
- Готово с шагом 2
- Шаг 3 ...
- Получение токена доступа ...
- Готово с шагом 3
- Получил жетон!
- Получение данных ...
- Получил данные!
- Получил жетон!
- Получение данных ...
- Получил данные!
- Получил жетон!
- Получение данных ...
- Получил данные!