Асинхронная функция JavaScript, когда возвращается обещание, разрешенное в случае отсутствия возвращаемого значения

Этот вопрос касается предложения async / await. Насколько я понимаю, функция следующая:

async function foo() {
   return await someAsyncFn();
   await performSomeOtherAsyncAction();
   doOneLastThing();
}

возвращается, как только разрешается someAsyncFn ().

Однако что, если нет возвращаемого значения:

async function() {
       await someAsyncFn();
       await performSomeOtherAsyncAction();
       doOneLastThing();
}

Возвращает ли обещание разрешение сразу после выхода из функции, подобной этой:

function foo() {
    someAsyncFn()
        .then(() => {
            return performSomeOtherAsyncAction();
        })
        .then(() => {
            doOneLastThing();
        });
}

или он ждет, пока не разрешится внутреннее обещание, например:

function foo() {
    return someAsyncFn()
        .then(() => {
            return performSomeOtherAsyncAction();
        })
        .then(() => {
            doOneLastThing();
        });
}

person pQuestions123    schedule 06.01.2017    source источник
comment
есть ли причина, по которой вы просто не проверяете это? :)   -  person Victor Radu    schedule 06.01.2017
comment
@VictorRadu Да, ты прав, я должен.   -  person pQuestions123    schedule 06.01.2017
comment
Если вы все же дайте нам знать, пожалуйста: D   -  person Victor Radu    schedule 06.01.2017


Ответы (2)


async/await позволяет писать асинхронные процессы в синхронном «стиле». Он работает точно так же, как вы ожидаете, что будет работать синхронная функция, за исключением того, что она возвращает обещание. Другими словами, он будет вести себя как в вашем последнем примере. Он выполняет все операторы и возвращает обещание, которое разрешается в undefined.

person Felix Kling    schedule 06.01.2017

Я бы сказал, что на основе Спецификации команда Async / await только обертывает обещание / процесс и ожидает, что вызов разрешения / отклонения вернет значение, если существует, если нет, он вернет undefined и продолжит следующее обещание / процесс с ожиданием. Итак, это будет так:

return promise.then(() => someAsyncFn())
        .then(() => performSomeOtherAsyncAction() )
        .then(() => doOneLastThing() )
person damianfabian    schedule 06.01.2017