请原谅我这个问题,这对于一个更有经验的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..?
我不熟悉承诺,也不知道如何处理这个问题。我读过的所有文档都说异步调用是件好事,但我的应用程序是线性的,需要先前调用的数据才能继续。我不需要承诺,我需要完整的回复。 (如果我对promises / ajax的理解有限,请纠正我!)
如何更改上面的代码以便为我提供我想要的响应对象? (JSON首选)或者,我如何处理获取所需数据的承诺?
谢谢, 查理
答案 0 :(得分: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);
}
当你开始学习如何处理承诺时会有点痛苦,但是他们的回报是巨大的。只是继续练习一段时间,最终你就能掌握它。
答案 1 :(得分:1)
基本上,通过承诺,您可以通过将then
链接在一起来解决这个问题。
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
语句中提供的回调中发生处理被拒绝的承诺。)