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);
});
В этом конкретном случае нет смысла разбивать это на две части. then
s вместо того, чтобы просто работать с 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);
}
Сначала сложно научиться справляться с обещаниями, но они окупаются. Просто продолжайте практиковать некоторое время, и в конце концов вы получите навык.