Два значения сравниваются до того, как функция вернет значение

У меня есть код, в котором функция (которая содержит обещание) запускается, а затем возвращает логическое значение. Затем я проверяю, верно ли это значение, и если да, то запускаю другой код. У меня были значения, записываемые в консоль для выполнения некоторой отладки, и я заметил, что оператор if, который проверяет, возвращает ли функция значение true, выполнялся еще до того, как функция возвращала что-либо.

Я пытался использовать «ожидание» и «асинхронность», но не нашел никакого успеха в их использовании.

javascript
function myFunc()
   promise()
      .then(value => {
         console.info('Returned true');
         return true;
      })
      .catch(err => {
         console.info('Error', err);
      });
end

if (myFunc()) {
   console.info('Value was true');
} else {
   console.info('Value was false');
}

Ожидал:

Returned true
Value was true

Действительный:

Value was false
Returned true
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
55
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы пытаетесь вернуть обещание из своей функции, в тот момент, когда вы используете обещания, вы работаете с асинхронным кодом. Это означает, что для того, чтобы получить значение из промиса, сначала нужно выполнить обещание.

В вашем случае вы оцениваете возвращаемое значение вашей функции, а не возвращаемое значение обещания. Поскольку у вас нет явного возврата в вашей функции, она возвращает неопределенное значение. Вот почему вы видите value was false в консоли. Затем ваше обещание выполняется, и вы видите Returned true в консоли, но вы никогда не оценивали это значение, возвращаемое обещанием.

Предположим, что вы вызываете свою функцию из глобальной области видимости, вам нужно будет использовать синтаксис .then, чтобы получить доступ к значению, возвращаемому вашим обещанием.

Итак, если ваша функция выглядит примерно так:

function myFunc() {
  return Promise.resolve()
    .then(value => {
      console.info('Returned true');
      return true;
    })
 }

Ваш оператор if должен превратиться в что-то вроде этого:

myFunc().then(value => {
   if (value) console.info('It is true')
   else console.info('Is it false')
 })

По сути, вы ждете, пока ваше обещание будет выполнено, и когда это произойдет, вы получите возвращаемое значение по параметру (в этом простом примере это всегда верно, но также может быть и ложным).

Я надеюсь, это поможет вам.

Попробуйте вернуть обещание из функции:

function myFunc()
   return promise()
      .then(value => {
         console.info('Returned true');
         return true;
      })
      .catch(err => {
         console.info('Error', err);
      });
end

if (myFunc()) {
   console.info('Value was true');
} else {
   console.info('Value was false');
}

Это не лучшая практика, я бы придерживался старой доброй цепочки обещаний:

promise()
  .then(value => {
     if (value) {
       console.info('Value was true');
     } else {
       console.info('Value was false');
     }
   })
   .catch(err => {
         console.info('Error', err);
   });

Вам нужно использовать «ожидание», чтобы дождаться ответа обещания

promise = () => new Promise( (resolve, reject ) => resolve(true) );

async function myFunc(){
   try {
     let value = await promise();

     if (value === true){
       console.info('Returned true');
       return true;
     }
   } catch (err) {
     console.info('Error', err);
   }
}

async function main(){

  if ( await myFunc() ) {
   console.info('Value was true');
  } else {
   console.info('Value was false');
  }
}

main();

Другие вопросы по теме