У меня есть следующий пример асинхронного кода:
// Functions
function getSomePromise() {
let a = new Promise((resolve, reject) => {
setTimeout(function(){
console.log("Inside promise...");
resolve("Success!");
}, 1000);
});
return a;
}
async function someWrapper(i) {
console.log('A: '+ i);
await getSomePromise();
console.log('B: ' + i);
}
И два теста:
async function test1() {
for(let i=0; i<5; i++) {
// body copy-pasted of someWrapper function:
console.log('A: '+ i);
await getSomePromise();
console.log('B: ' + i);
}
}
async function test2() {
for(let i=0; i<5; i++) {
someWrapper(i);
}
}
А вот результаты в хромированной консоли после запуска раздельно test1()
и test2()
:
Test 1 | Test 2
---------------------------------------------
A: 0 | A: 0
Inside promise... | A: 1
B: 0 | A: 2
A: 1 | A: 3
Inside promise... | A: 4
B: 1 | Inside promise...
A: 2 | B: 0
Inside promise... | Inside promise...
B: 2 | B: 1
A: 3 | Inside promise...
Inside promise... | B: 2
B: 3 | Inside promise...
A: 4 | B: 3
Inside promise... | Inside promise...
B: 4 | B: 4
Вопрос: Почему, когда мы используем функцию someWrapper()
в for-loop
(test2), мы получаем другой результат, чем когда мы копируем и вставляем тело этой функции непосредственно в for-loop
(test1)?
(приведенный выше пример довольно абстрактен, однако «я обнаружил это поведение» при вызове запросов ajax (вместо console.log('A: '+ i);
и console.log('B: '+ i);
), последовательность которых очень важна в моем приложении (запрос A1
должен быть перед запросом B0
...))
async
иawait
, которые запускают промисы по порядку. Второй тест не делает, поэтому каждый промис запускается, а потом заканчивает по порядку. - person Sidney   schedule 07.02.2018await
заставляет цикл приостанавливаться в функцииgetSomePromise()
до тех пор, пока обещание не будет разрешено. Во втором тесте нетawait
, поэтому JavaScript успешно продолжает цикл после запуска каждого промиса. Создание функцииasync
на самом деле ничего не делает без использованияawait
в функции. - person Sidney   schedule 07.02.2018async
превращает необходимость ожидания значения в функциюPromise
. Это означает, что вы можете сделатьawait someWrapper(i)
, чтобы получить тот же результат. - person JJWesterkamp   schedule 07.02.2018async
немедленно возвращают промис, а с точки зрения вызывающей стороныawait
ничего не ждет. - person HMR   schedule 08.02.2018async function someWrapper()
, но эта функция ничего не возвращает (у нее даже нет оператораreturn
(!) ) - можете ли вы объяснить, что вы подразумеваете подasync functions immediately return a promise
? - person Kamil Kiełczewski   schedule 08.02.2018