Будете ли вы ждать возвращаемого значения в асинхронной функции?

1
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()

Я не вижу большой разницы, но задаюсь вопросом, лучше ли выполнять ожидание асинхронного возвращаемого значения в асинхронной функции или нет? Каковы причины, по которым предпочтение отдается одному решению другому? Есть ли какие-либо соображения относительно производительности, переносимости, удобства использования или семантики?

  • 1
    return await поскольку первая и единственная строка функции кажется немного глупой - вы также можете просто вернуть само Promise . Но это имеет смысл, если вы также хотите обрабатывать ошибки в этой async функции. (попробуй / вернись жди / лови)
  • 0
    Правильная точка @CertainPerformance, обработка ошибок может отличаться между main и delay100 , что оправдывает (в противном случае ненужное) delay100 в delay100 .
Теги:
async-await

2 ответа

3

Практически они одинаковы, так как в JS есть автоматическое развертывание Promises. Используйте то, что вам удобнее/удобнее для чтения.


Было сказано, что,

Семантически, с await вы возвращаете Promise<T> тогда как без await вы семантически возвращаете Promise<Promise<T>>. (Опять же, чтобы уточнить, оба результата дадут на практике один и тот же результат и даже точно такой же тип возвращаемого значения.)

  • 0
    И, как вы сказали, JS развернет Promise<Promise<T>> в T внутри main с await delay100() (просто для ясности)
  • 2
    Твой шаринган выглядит круто. : D
Показать ещё 3 комментария
0

Что ж, возвращение до опережения не будет иметь никакого значения, но ожидание перед вызовом функции будет иметь значение. См. Фрагменты кода ниже.

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()

Ещё вопросы

Сообщество Overcoder
Наверх
Меню