2016-12-18 2 views
0

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

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

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

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

Спасибо, Charlie

+0

PS: Я сначала попробовал Fetch, он дал мне обещание. Я превратился в суперагент (приведенный выше код), и это также дает мне обещание. –

+0

«Вся документация, которую я прочитал, говорит, что асинхронные вызовы - это хорошо, но мое приложение является линейным и требует данных от предыдущего вызова, прежде чем продолжить». - это именно то, что обещания предназначены для решения. Они более запутанны, чем ES7 async/ждут, что, как мы надеемся, все скоро, но они в основном разработаны для упрощения управления асинхронным кодом. – PMV

ответ

1

В принципе, с обещаниями, вы имеете дело с этим путем цепочки then s вместе.

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

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

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

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

+0

Спасибо! Это помогло мне. Поскольку мне все еще нужно дождаться, когда пользователь выберет что-то перед тем, как сделать следующий вызов api, я использовал ваш первый пример, и он сработал. Ура! –

1

Вам нужно обернуть вызов, требующий данные в 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); 
} 

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