Но document.createElement ('img') - это тоже функция, что и f1, она может отставать, но по какой-то причине мы не используем await на нем?Почему это так?
Это потому, что await
является зарезервированным ключевым словом, которое используется только в async function
.Не снаружи.Стимулом оператора await
является ожидание обещания.Поэтому, когда вы выполняете
await foo();
, тогда он работает, только если foo()
возвращает объект Promise
.
Следующее утверждение
document.createElement('img');
невернуть объект Promise, но HTMLImageElement
.Это не объект Promise
, поэтому вы не можете ждать его, используя await
.Существует событие onload
, которое можно использовать для выполнения действия, которое действует после загрузки изображения в:
const img = document.createElement('img');
img.onload = _ => console.log('after load');
img.src = 'url';
при обработке последнего оператора браузер извлекает информацию из указанного URL-адреса.,Когда это будет сделано с загрузкой информации, он вызовет .onload
, чтобы указать, что это сделано с загрузкой в данные изображения.
РЕДАКТИРОВАТЬ:
Можно запустить
async function loadImage() {
const img = await document.createElement('img');
...
}
без ошибок, поскольку await
преобразует результат в разрешенное Обещание, если оно не является Promise
объектом.Следующая цитата взята из MDN:
Если значение выражения, следующего за оператором await, не является Обещанием, оно преобразуется в разрешенное Обещание. source
Итак, возвращенный HTMLImageElement
преобразуется в Promise
объект с помощью вызова Promise.resolve(...)
.Затем await
затем обрабатывает объект обещания, как указано.