async function delay(t) {
return new Promise(f=>setTimeout(f, t))
}
async function delay100() {
return await delay(100) // <---- do we need 'await' here?
}
async function main(){
await delay100(); console.log('ok')
await delay100(); console.log('ok')
await delay100(); console.log('ok')
await delay100(); console.log('ok')
}
main()
Я не вижу большой разницы, но задаюсь вопросом, лучше ли выполнять ожидание асинхронного возвращаемого значения в асинхронной функции или нет? Каковы причины, по которым предпочтение отдается одному решению другому? Есть ли какие-либо соображения относительно производительности, переносимости, удобства использования или семантики?
Практически они одинаковы, так как в JS есть автоматическое развертывание Promises. Используйте то, что вам удобнее/удобнее для чтения.
Было сказано, что,
Семантически, с await
вы возвращаете Promise<T>
тогда как без await
вы семантически возвращаете Promise<Promise<T>>
. (Опять же, чтобы уточнить, оба результата дадут на практике один и тот же результат и даже точно такой же тип возвращаемого значения.)
Promise<Promise<T>>
в T
внутри main
с await delay100()
(просто для ясности)
Что ж, возвращение до опережения не будет иметь никакого значения, но ожидание перед вызовом функции будет иметь значение. См. Фрагменты кода ниже.
async function delay(t) {
return new Promise(f=>setTimeout(f, t))
}
async function delay100(input) {
return await delay(input)
}
async function main(){
delay100(100).then(()=>console.log('ok1'));
delay100(2000).then(()=>console.log('ok2'));
delay100(140).then(()=>console.log('ok3'));
delay100(160).then(()=>console.log('ok4'));
}
main()
async function delay(t) {
return new Promise(f=>setTimeout(f, t))
}
async function delay100(input) {
return delay(input)
}
async function main(){
await delay100(100).then(()=>console.log('ok1'));
await delay100(2000).then(()=>console.log('ok2'));
await delay100(140).then(()=>console.log('ok3'));
await delay100(160).then(()=>console.log('ok4'));
}
main()
return await
поскольку первая и единственная строка функции кажется немного глупой - вы также можете просто вернуть самоPromise
. Но это имеет смысл, если вы также хотите обрабатывать ошибки в этойasync
функции. (попробуй / вернись жди / лови)main
иdelay100
, что оправдывает (в противном случае ненужное)delay100
вdelay100
.