Superagent&获取返回的承诺 - 如何处理这些承诺?

时间:2016-12-18 04:16:06

标签: javascript reactjs superagent

请原谅我这个问题,这对于一个更有经验的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首选)或者,我如何处理获取所需数据的承诺?

谢谢, 查理

2 个答案:

答案 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语句中提供的回调中发生处理被拒绝的承诺。)