Есть две основные причины, по которым я могу придумать:
2) doSomethingAsynchronous()
возвращает Обещание , и вполне допустимо и принято делать что-то с этим Обещанием, кромеawait
it.
Вот один пример:
const promises = [];
for ( let i = 0; i < 100; i++ )
promises.push( doSomethingAsynchronous( ) );
const results = await Promise.all( promises );
Это запустит все 100 асинхронных задач одновременно и ожидает только в конце;очень отличается от наличия await
внутри цикла, который будет ждать каждого Обещания перед началом следующей задачи.
Фактически Обещания существуют уже некоторое время дольше, чем async / await, и неявное ожидание этих обещаний может сильно сломаться.существующего кода.Поскольку JavaScript используется в веб-браузерах, они очень строги, чтобы не нарушать обратную совместимость.
2) Это значительно усложнит чтение / запись JavaScript.Рассмотрим следующий код:
setTimeout( function ( ) { console.log( 'FOO' ) }, 0 );
console.log( x.result );
Поскольку JavaScript запускает код до завершения, прежде чем цикл событий продолжается, ясно, что console.log( x.result );
запускается раньше, чем console.log( 'FOO' );
.Если бы JavaScript имел неявное await
, вы бы не знали, является ли x.result
синхронным или нет, и это означало бы, что порядок этих журналов станет недетерминированным.В целом, знание порядка, в котором будет выполняться ваш код, очень важно, и невозможность определить, правильно ли определен порядок или нет, затруднит программирование на JavaScript.
Вот пример:
(async _ => {
const x = new Promise( resolve => setTimeout( _ => resolve( { foo: 'bar' } ), 1000 ) );
setTimeout( function ( ) { console.log( '2) async' ) }, 0 );
x.foo;
console.log( '1) Sync' );
})();
Поскольку x.foo
является синхронной операцией (доступ к свойству Promise foo
будет просто неопределенным, но это только для демонстрации, потерпите меня)журналов, как и ожидалось, но если в этом коде было неявное ожидание (которое мы можем смоделировать с помощью (await x)
:
(async _ => {
const x = new Promise( resolve => setTimeout( _ => resolve( { foo: 'bar' } ), 1000 ) );
setTimeout( function ( ) { console.log( '2) async' ) }, 0 );
(await x).foo; // Simulate implicit await
console.log( '1) Sync??' );
})();
Журналы происходят в обратном порядке (или потенциально недетерминированный порядок для более коротких таймеров).
Вы также не сможете узнать,x.result
может выдать ошибку, просто посмотрев на нее.Вам нужно увидеть, где определено x
, чтобы проверить, является ли это Обещанием (ожидание Обещания выдает ошибку, если Обещание отклонено), чтобы знать, что строка может выдать.