Superagent & Fetch возвращают обещания - как справиться с этим?

Простите меня за этот вопрос, который, вероятно, будет легко решить для более опытного программиста JS. Я читал о superagent и fetch, пытаясь заставить работать вызовы REST. (Я был в состоянии заставить работать данные odata, но теперь мне нужно REST). Тем не менее, я запутался в обещаниях. В настоящее время я пытаюсь сделать простой request.get (или fetch.get) с помощью следующего кода:

this.ticketList = Request.get(url).then((response) => {
    return response.body.Tickets;
});
console.log(this.ticketList); // Returns a promise..?

Я не знаком с обещаниями и не знаю, как справиться с этим. Вся документация, которую я прочитал, говорит, что асинхронные вызовы - хорошая вещь, но мое приложение линейно и требует данных предыдущего вызова, прежде чем продолжить. Мне не нужно обещание, мне нужен полный ответ. (Пожалуйста, поправьте меня, если мое ограниченное понимание обещаний /ajax неверно!)

Как я могу изменить приведенный выше код, чтобы получить нужный мне объект ответа? (JSON предпочтительнее) Или, как мне справиться с обещанием получить нужные мне данные?

Спасибо чарли

2 ответа

Решение

В основном, с обещаниями, вы справляетесь с этим, цепляясь thenвместе.

Request.get(url)
       .then((response) => {
           return response.body.Tickets;
        })
       .then((ticketList) => {
           console.log(ticketList);
        });

В этом конкретном случае нет смысла разбивать это на две части. thens вместо того, чтобы просто работать с response.body.Tickets напрямую. Обычно вы делаете все здесь до следующего момента, когда вам нужно сделать асинхронный вызов, а затем вы получите новое обещание. Например:

Request.get(url)
       .then((response) => {
           var ticketList = response.body.Tickets;
           console.log(ticketList);
           return Request.get(url2);
        })
       .then((response2) => {
           /* ... */
        });

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

Вы должны обернуть свой звонок, требуя данные в then заявление. К сожалению, большинство HTTP-запросов являются асинхронными, и вы мало что можете сделать без каких-либо серьезных действий (и это того не стоит).

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

Пример на основе кода, который вы дали:

function shareTickets() {
  // Get the promise to resolve
  var getTicketPromise = getTickets();

  // Resolve the promise and handle as needed
  getTicketPromise
    .then((ticketData) => {
      console.log('I got the data from the promise: ' + ticketData);
      doSomethingWithData(ticketData);
    })
    // If an error happens, you can catch it here
    .catch((error) => console.log(error));
}

// Return the promise itself so it can be resolved in the other function.
function getTicketPromise() {

  // Just return the promise
  return Request.get(url);
}

Сначала сложно научиться справляться с обещаниями, но они окупаются. Просто продолжайте практиковать некоторое время, и в конце концов вы получите навык.

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