Как получить данные из ожидающего решения обещания без асинхронного ожидания / ожидания? - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть абстракция:

function fetchDataFromAPI() {
  const url = `https://api...`
  return fetch(url).then(response => response.json())
}

Я хочу использовать его в моем другом фрагменте кода, например:

if(something){
  const data = fetchDataFromAPI()
  return data 
}

, если я console.log данные, которые я получаю, будут обработаны в ожиданииОбещание

Promise {<pending>}
  __proto__: Promise
  [[PromiseStatus]]: "resolved"
  [[PromiseValue]]: Object

Как получить этот Объект в data вместо Обещания?

Ответы [ 3 ]

0 голосов
/ 12 апреля 2019

Нет, вы не можете без использования обещаний или асинхронных / ожидающих и т. Д., Потому что вызов API REST является асинхронной операцией и не блокирует.

Когда вы делаете вызов REST API, код не должен ждать, пока API вернет значение, потому что это может занять много времени, из-за чего программа перестает отвечать на запросы, поэтому проектный сетевой запрос классифицируется как асинхронная операция.

0 голосов
/ 12 апреля 2019

Promise - это языковая конструкция, которая заставляет движок JavaScript продолжать выполнение кода без ожидания возврата внутренней функции, также известной как executor.

var p = new Promise(function(resolve, reject) {
  setTimeout(function() {
    resolve('foo');
  }, 300);
});

console.log(p);

По сути, обещание - это прославленный синтаксический сахар дляПерезвоните.Мы увидим, как сначала получить более реалистичный код:

function someApiCall(){
  return new Promise(function(resolve, reject){
    setTimeout(()=>{
      resolve('Hello');
    })
  })
}

let data = someApiCall();

console.log(data);

Это так называемый асинхронный код, когда его выполняет движок javascript, someApiCall немедленно возвращает результат, в данном случае ожидающее обещание:

> Promise {<pending>}

Если вы обратите внимание на исполнителя, вы увидите, что нам нужно передать разрешение и отклонить аргументы, такие как обратные вызовы.Да, это обратные вызовы, встроенные прямо в язык.Когда кто-либо из них позвонит, обещание изменит свое состояние и, следовательно, будет урегулировано.Мы не называем это разрешенным, потому что разрешение подразумевает успешное выполнение, но функция также может выдавать ошибку.

Как мы получаем данные?Ну, нам нужно больше обратных вызовов, которые будут вызваны функцией-исполнителем после выполнения обещания:

var p = new Promise(function(resolve, reject) {
  setTimeout(function() {
    resolve('foo');
  }, 300);
});

p.then((result) => {
  console.log(result); // foo
}).catch((err) => {
  console.log(err);
});

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

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

Теперь, чтобы ответить на ваш вопрос, как мы получаем данные из обещания.Ну, мы не можем.

Если вы посмотрите внимательно, вы увидите, что мы на самом деле не выводим данные, а продолжаем передавать обратные вызовы.Передача данных не производится, но передаются обратные вызовы.

p.then((result) => {
  console.log(result);
}).catch((err) => {
  console.log(err);
});

Некоторые говорят, что используют await:

async function() {
  let result = await p;
}

Но здесь есть одна загвоздка.Мы должны или обернуть его в асинхронную функцию.Всегда.Зачем?Потому что Async / await - это еще один уровень абстракции или синтаксического сахара, какой бы вы ни предпочли, помимо обещанного API.Вот почему мы не можем использовать await напрямую, а всегда заключать его в асинхронное выражение.

Подводя итог, мы должны следовать определенному соглашению и писать краткий код с тесно связанными обратными вызовами, когда мы используем обещание или async / await.Либо движок javascript, либо транспортеры, такие как babeljs или typcript, преобразуют этот код в обычный javascript для запуска.

Я могу понять вашу путаницу, потому что люди говорят, что выводят данные, когда говорят об обещаниях, но мы не получаем никаких данныхвне, но передайте обратный вызов, который будет выполнен, когда данные будут готовы.

Надеюсь, теперь все ясно.

0 голосов
/ 12 апреля 2019

Чтобы избежать асинхронности / ожидания, вам нужно использовать другое .then:

if (something) {
  return fetchDataFromAPI()
    .then((data) => data /* you can console.log(data) here */)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...