Как прочитать значение, разрешенное обещанием, из вызова функции

#javascript #reactjs

#javascript #reactjs

Вопрос:

Всего у меня есть 2 функции, одна функция, которая возвращает новое обещание и преобразуется в переменную, вот так:

   function promiseTest(data) {
    const delay = 200;
    return new Promise(resolve => setTimeout(() => resolve(data), delay));
  }
  

а затем другая функция, в которой я вызываю эту функцию, а затем вставляю для data переменной объект JSON.

     function getInfo() {
     return promiseTest(require('./allData.json'));
    }
  

Итак, мой вопрос в том, как мне прочитать данные, разрешаемые Promise из getInfo функции, просто в простом console.log?

Скажите: console.log(getInfo().data) (но, очевидно, это не работает, но, надеюсь, поможет с тем, что мне нужно).

Комментарии:

1. Вы не можете просто волшебным образом сделать асинхронную операцию синхронной. Используйте async / await, передавайте обратные вызовы или используйте .then .

Ответ №1:

С promises вы должны использовать / извлекать данные с помощью a .then(); так что

 getInfo().then((data) => console.log(data));
  

Есть ли особая причина, по которой вам нужно использовать promise? Ваш пример, похоже, подходит для простого использования функции setTimeout

Ответ №2:

Есть несколько способов сделать это.

Асинхронный / ожидающий

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

 async function promiseTest(data) {
    const delay = 200;
    return new Promise(resolve => setTimeout(() => resolve(data), delay));
}


async function getInfo() {
    return await promiseTest(require('./allData.json'));
}
  

Затем вы можете получить результат getInfo() , ожидая его:

 console.log(await getInfo());
  

Вот некоторые чтения, которые должны вам помочь:

https://javascript.info/async-await
https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Instructions/async_function

.then()

Вы также можете использовать старый способ, используя then:

 function promiseTest(data) {
    const delay = 200;
    return new Promise(resolve => setTimeout(() => resolve(data), delay));
}


function getInfo() {
    return promiseTest(require('./allData.json'));
}

getInfo().then(data => console.log(data));
  

Передать обратный вызов

Вы могли бы передать обратный вызов вашему методу getInfo.

 function promiseTest(data) {
    const delay = 200;
    return new Promise(resolve => setTimeout(() => resolve(data), delay));
}


function getInfo(callback) {
    promiseTest(require('./allData.json')).then(data => callback(data));
}

getInfo(data => console.log(data));
  

Ответ №3:

Значение, возвращаемое promise, передается в .then функцию в качестве первого параметра.

Пожалуйста, смотрите: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then

В вашем случае это может быть: getInfo().then(data => console.log(данные));

Надеюсь, это поможет.