【问题标题】:Angular dependent $http requestsAngular 依赖的 $http 请求
【发布时间】:2018-12-14 15:50:28
【问题描述】:

我正在尝试通过发布请求获取数据,而我从中查询的 API 最多返回 50 个元素。到目前为止,这很有效,但是现在我们有一些用例,其中必须接收更高的不确定数量的元素。 $http-方法返回一个承诺,但我必须依靠这些数据来提出另一个请求。 我的简化代码:

var data =
    "q=" + term
    "&timestamp=" + latest

$http({
        method: 'POST',
        url: url,
        data: data
    }).then(
        function(response) {
            let dataList = response.data.list; 
            if(dataList.length > 50)
               /*TODO: new query with other timestamp-value*/
            return dataList ;

        },
        function(response) {
            if(shouldLog){
                console.log("[DebuggingService] " + response);
            }
        }
    );

有没有办法根据之前的请求组合多个http请求?

编辑

没有分页。因此,必须更改时间戳值。 (获取响应的最新时间戳)

【问题讨论】:

  • 响应数据中有分页信息吗?以及如何在请求中定义分页?
  • coog 标注。我添加了其他信息

标签: javascript angularjs promise


【解决方案1】:

我会将该请求包装在一个函数中,该函数也可以在 then() 内递归调用以返回另一个请求承诺

类似:

function getData(term, time, res = []) {

  var data = "q=" + term + "&timestamp=" + time
  // return the $http promise
  return $http({
    method: 'POST',
    url: url,
    data: data
  }).then(function(response) {
    let dataList = response.data.list;
    // merge new data into final results array
    res = res.concat(dataList);

    if (dataList.length > 50) {
       const timeStampFromResponse = //????
      // return new request promise
      return getData(term, timeStampFromResponse, res)
    }
    // return final array
    return res;

  })
}

getData(term, latest).then(function(results) {
  // all results available here
}).catch(function(response) {
  if (shouldLog) {
    console.log("[DebuggingService] " + response);
  }
})

【讨论】:

    【解决方案2】:

    为什么不这样做:

    var data =
      "q=" + term + "&timestamp=" + latest;
    
    var amounts = 2;
    url = 'https://api.github.com/search/repositories?q=topic:ruby+topic:rails';
    
    call(url, data, checkForMore);
    
    function call(url, data, callback) {
      $http({
        method: 'POST',
        url: url,
        data: data
      }).then(function(data){
        console.log(data);
        console.log('------------');
        callback(data);
      });
    }
    
    function checkForMore(data){
        if (amounts > 0){
            amounts -= 1;
          var newData = "q=" + term +
                                        "&timestamp=" + data.SomehowGetLastestTimestamp;
          call(url, newData, checkForMore);
        } else {
            // Save it maybe?
        }
    }
    

    这是一个非常粗略的示例,可能不起作用,但它让您知道该怎么做。

    基本上,有一个在.then 匿名函数上调用的回调方法。然后你可以传入数据并检查是否需要更多调用它。 (根据您的情况)。如果你这样做了,那么只需再次调用call 函数,但更新你的数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-12
      • 2021-06-13
      相关资源
      最近更新 更多