Я столкнулся с непоследовательным поведением в Google Chrome 60.0.3112.78 (официальная сборка) (64-разрядная версия) при использовании современного ES6+ async/await, в зависимости от того, использую ли я квадратные скобки в функции стрелки, которая возвращает Обещание. То же самое происходит в Node.js. Мне трудно понять, почему.
Я понимаю, что это не то, как реализовать функцию sleep(), но это самый простой способ продемонстрировать. Рассмотрим следующий пример фрагмента кода.
function sleep(ms = 0) {
return new Promise(resolve => setTimeout(resolve, ms));
}
(async () => {
console.log('a');
await sleep(5000);
console.log('b');
})()
Как и ожидалось, это напишет a в консоль, подождет 5 секунд, а затем напишет b в консоль.
Более короткая запись с использованием функции стрелки для возврата Promise.
const sleep = ms => { return new Promise(resolve => setTimeout(resolve, ms)) }
(async () => {
console.log('a');
await sleep(5000);
console.log('b');
})()
Как и ожидалось, этот код ведет себя так же. a и b записываются в консоль с интервалом 5000 миллисекунд между ними.
Следующий код не работает. Единственное отличие состоит в том, что я не заключаю возврат Promise в скобки в первой строке.
const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
(async () => {
console.log('a');
await sleep(5000);
console.log('b');
})()
В этом случае ожидание сна не работает. На самом деле этот код вообще ничего не делает. Он ничего не записывает в консоль, ни a, ни b.
Я считаю себя довольно опытным, но в настоящее время я не понимаю этого. Почему скобки важны в данном конкретном случае? Возвращаемое значение идентично, верно? И почему даже символ a не регистрируется в консоли?
Кто-нибудь, пожалуйста, объясните мне точно и конкретно, почему это так. Это баг или мне самому нужно поспать?
Большое тебе спасибо.
function sleep(ms) { return … }
) которым вообще не нужна точка с запятой :-) - person Bergi   schedule 05.08.2017