Я не смог найти какой-либо хорошей информации о том, что означают несколько await
в одной строке или как их следует обрабатывать. Поэтому я создал следующий тестовый код (выполняется в Node):
async function resolveAfterNSeconds(n, value) {
return new Promise((resolve) => {
setTimeout(() => {
resolve(value);
}, n*1000);
});
};
async function test(which) {
const start = new Date().getTime();
let result;
switch (which) {
case 1:
result = await resolveAfterNSeconds(10, await resolveAfterNSeconds(2, 'done'));
break;
case 2:
result = await resolveAfterNSeconds(2, await resolveAfterNSeconds(10, 'done'));
break;
case 3:
result = await resolveAfterNSeconds(10, resolveAfterNSeconds(2, 'done'));
break;
case 4:
result = await resolveAfterNSeconds(2, resolveAfterNSeconds(10, 'done'));
break;
case 5:
result = resolveAfterNSeconds(10, await resolveAfterNSeconds(2, 'done'));
break;
case 6:
result = resolveAfterNSeconds(2, await resolveAfterNSeconds(10, 'done'));
break;
}
const end = new Date().getTime();
console.log([which, result, (new Date().getTime()-start)/1000]);
}
test(1); // [1, 'done', 12], as expected
test(2); // [2, 'done', 12], as expected
test(3); // [3, 'done', 10], as expected (kind of)
test(4); // [4, 'done', 10], but expected: [4, Promise, 2]
test(5); // [5, Promise, 2], as expected
test(6); // [6, Promise, 10], as expected
Я думаю, что я понимаю, почему в случае 3 вместо Promise
возвращается 'done'
- тайм-аут 2с к тому времени уже истек (я прав ?).
Однако я не понимаю, случай 4: Кажется, что await
в начале также каким-то образом относится к внутреннему Promise
, потому что в противном случае это Promise
не должно быть возвращается (вместо 'done'
) через 2 с?
Но если внешний await
на самом деле относится и к внутреннему Promise
, не значит ли это, что случаи 1 и 2 не являются смысл и всегда следует заменять на случаи 3 и 4 (соответственно), чтобы два или более await
в одной строке никогда не были полезны?