Я пытаюсь научиться асинхронно ждать. В этом коде -

const myFun = () => {
    let state = false;

    setTimeout(() => {state = true}, 2000);

    return new Promise((resolve, reject) => {
        setTimeout(() => {
            if(state) {
                resolve('State is true');
            } else {
                reject('State is false');
            }
        }, 3000);
    });
}

const getResult = async () => {
    return await myFun();
}

console.log(getResult());

Почему я получаю вывод как -

Promise { <pending> }

Вместо какой-то ценности? Разве функция getResult() не должна ждать, пока функция myFun() решит ее значение обещания?

23
hg_git 25 Авг 2017 в 10:39

3 ответа

Лучший ответ

Если вы используете async / await, все ваши звонки должны использовать Promises или async / await. Вы не можете просто волшебным образом получить результат асинхронного вызова синхронизации.

Ваш последний звонок должен быть:

getResult().then(response => console.log(response));

Или что-то вроде:

(async () => console.log(await getResult()))()
20
Ben Fortune 25 Авг 2017 в 08:35

Там нет смысла асинхронизировать и ждать, когда это фактический случай:

Promise.resolve(3).then(console.log); console.log(4);
4
3

Другими словами, поскольку then () разветвляется и выполняется медленнее, чем последующие операторы (даже для разрешенного Promise), нам нужно поместить последующие операторы в then, например:

Promise.resolve(3).then(_ => { console.log(_); console.log(4); });
3
4

И так как это правда, то зачем ждать. Так что мне еще предстоит понять, почему асинхронные и ожидающие вообще существуют.

1
ekerner 12 Дек 2018 в 09:33

Что вам нужно понять, так это то, что async / await не заставляет ваш код работать синхронно, но давайте напишем его так, как если бы он был:

Вкратце: функция с асинхронной передней частью буквально выполняется асинхронно, отсюда и ключевое слово «асинхронный». И ключевое слово «await» заставит ту строку, которая использует ее внутри этой асинхронной функции, ожидать обещание во время его выполнения. Таким образом, хотя строка ожидает, вся функция по-прежнему выполняется асинхронно, если только вызывающая сторона этой функции также не «ждет» ...

Более детально объяснено: когда вы помещаете асинхронный вызов перед функцией, то, что фактически делает, это заставляет его возвращать обещание с тем, что эта функция возвращает внутри него. Функция выполняется асинхронно, и когда выполняется оператор return, обещание разрешает возвращаемое значение.

Значение в вашем коде:

const getResult = async () => {
    return await myFun();
}

Функция «getResult ()» вернет Promise, который разрешится после завершения выполнения. Таким образом, строки внутри функции getResult () выполняются асинхронно, если только вы не скажете функции, вызывающей getResult (), также «ожидать» ее. Внутри функции getResult () вы можете сказать, что она должна ожидать результата, что заставляет выполнение getResult () ждать, пока оно не выполнит обещание, но вызывающая функция getResult () не будет ждать, пока вы также не скажете вызывающей стороне 'await » .

Таким образом, решение будет называться либо:

getResult().then(result=>{console.log(result)})

Или при использовании в другой функции вы можете просто снова использовать «ожидание»

async callingFunction(){
    console.log(await(getResult());
}
8
Pim_nr_47 30 Май 2019 в 12:39