Асинхронная функция не вернется, когда обещание будет выполнено - PullRequest
0 голосов
/ 30 июня 2019

У меня есть следующий код:

let checkValue = async (nodeUrl, nodeName, value) => {

    let json = await getValue(nodeUrl, value);

    let obj = JSON.parse(json.value.information);

    for (let i = 0; i < obj.nodes.length; i++) {
        if (obj.nodes[i] === nodeName) {
            return Promise.resolve(true);
        }    
    }
    return Promise.resolve(false);
}

Я пытался использовать Promise.resolve() для обработки возвращенного значения Promise, но я все еще получаю Promise { <pending> } return.Почему это происходит?

1 Ответ

1 голос
/ 01 июля 2019

Давайте немного объясним, что происходит в функции async.

Во-первых, все асинхронные функции возвращают обещание.Всегда.Вам всегда нужно будет использовать .then() или await, чтобы получить значение из возвращенного обещания.

Во-вторых, вот последовательность событий в вашей функции.

  1. Вы вызываетеcheckValue(...) и передать его аргументы.
  2. Первая строка выполняет await getValue().
  3. Это вызывает getValue() и получает обещание обратно.
  4. Поскольку вы делаете await, он приостанавливает дальнейшее выполнение функции и, в этот момент времени,Функция возвращает неразрешенное обещание.
  5. Это неразрешенное обещание - это то, на что вы смотрите.
  6. Между тем, остальная часть вашего кода после вызова getValue() продолжает выполняться.
  7. Некоторое время спустя, когда интерпретатор JS завершит работу над тем, что делал, и перейдет в очередь событий для следующего события, он найдет событие, которое приведет к getValue() разрешению его обещания.
  8. В этот моментразрешенное значение из обещания getValue() присваивается вашей переменной json, и выполнение функции checkValue() приостанавливается и продолжается.
  9. Затем, в зависимости от значений в цикле for, ваша функция завершит работу, вернув разрешенное обещание.Обратите внимание, что нет причин делать return Promise.resolve(true) или return Promise.resolve(false).Просто return true или return value - это все, что требуется.Независимо от значения return из функции async становится разрешенным значением обещания, которое уже было возвращено из этой функции.Переводчик сделает это за вас.

Я пытался использовать Promise.resolve () для обработки возвращенного значения Promise, но я все еще получаю Promise { <pending> } return.Почему это происходит?

Во-первых, вы получаете обещание, потому что все функции async возвращают обещание.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...