Обещание async / await return {<pending>} - PullRequest
0 голосов
/ 31 августа 2018

мой вопрос: почему этот журнал 'обещает {ожидает}' несмотря на то, что я использовал async / await? Я проверил похожие вопросы и ответы на них, и кажется, что все должно быть в порядке, но это не так. Как я могу изменить его, чтобы получить результат и почему? Спасибо.

const rp = require('request-promise-native');

async function sampleFunc() {
    let sample = await rp({
        uri: 'http://google.com',
        jar: true
    });
    return sample;
}

async function f() {
    return await sampleFunc();
}

console.log( f());

1 Ответ

0 голосов
/ 31 августа 2018

async-await на самом деле просто синтаксический сахар для обещаний, он не заставляет асинхронный код выполняться синхронно (то есть он не блокирует выполнение кода). Ваш код эквивалентен следующему:

function sampleFunc() {
    return new Promise(function(resolve) {
        rp({
            uri: 'http://google.com',
            jar: true
        }).then(function(sample) {
           resolve(sample);
        });
    });
}

function f() {
    return new Promise(function(resolve) {
        sampleFunc().then(function(result) {
            resolve(result);
        });
    });
}

console.log( f());

(Да, я знаю, что приведенный выше код демонстрирует анти-шаблон. Это только для иллюстрации)

Как видите, функция async действительно неявно возвращает обещание, которое разрешается со значением, которое вы в конечном итоге возвращаете внутри функции (или отклоняете, если вы throw что-то) , Именно поэтому async-await может использоваться только для функций и, следовательно, не применяется на верхнем уровне.

Контекст, вызвавший функцию, совершенно не зависит от того факта, что функция async, она просто вызывает функцию, возвращает обещание и переходит к следующей строке кода. Ваш console.log() живет в этом внешнем контексте и видит только обещание, которое было возвращено.

...