Chain API http请求取决于先前请求的响应

时间:2017-06-07 12:15:57

标签: angular rxjs angular2-observables

我正在尝试实施链式http请求,该请求将重复X次,并在上次请求没有响应时停止。

它应该如何运作。

例如,首先我打电话

http://example.com/?skip=0

并且回复是:

{
   skip=10
},

比我打电话

http://example.com/?skip=10
...
http://example.com/?skip=20

并且在跳过20响应是

{
  "message" : "You reach the end"
}

我需要在那里停下来。但是当我得到"跳过"作为回应,并在我添加跳过下一个请求的方式重复它们。

由于

2 个答案:

答案 0 :(得分:3)

根据描述,听起来你实际上意味着“分页”相同的查询而不是链接几个相关的查询。为此,您可以使用expand

// Start with skip 
Observable.of({skip: 0})
  // Feeds the response resulting stream back into this function
  .expand((response) => {
    // Continue expanding if there is a skip parameter
    if (response.skip >= 0)
      return this.http.get(`http://example.com/?skip=${skip}`);
    // Stop expanding if there is no more data
    else
      return Observable.empty();
  }, 1 /* Limit the number of consecutive queries*/);

答案 1 :(得分:-1)

如果您没有太多电话,那么您可以将它们链接在一起,如下所示。这将允许您更改返回的数据并在每个阶段对其进行操作:(如果不是100%语法正确的话,我会解释代码,所以道歉)

{'arg1': 1, 'arg2': 2, 'arg3': 'foo', 'arg4': 1}

然后用

打开它
$scope.call1 = function (values) {
   $.ajax({
        url: _url,
        method: 'GET'
    })
    .done(function (data) {
        ...do stuff with data...
        $scope.call2(data);
    })
};

$scope.call2 = function (values) {
   $.ajax({
        url: _url,
        method: 'GET'
    })
    .done(function (data) {
        ...do stuff with data...
        $scope.call3(data);
    })
};

$scope.call3 = function (values) {
   $.ajax({
        url: _url,
        method: 'GET'
    })
    .done(function (data) {
        ...do stuff with data...
        ...this is the end...
    })
}; 

这将仅在前一个方法完成后依次调用每个方法。 如果你有很多(即在一种for循环中),那么你必须将它们添加到排队类型系统。