javascript - Angular 2 : Dynamic synchronous http requests

标签 javascript http angular rxjs observable

目标:发出一系列同步 http 请求并能够将它们作为一个可观察流订阅。

示例(不工作):

let query_arr = ['test1','test2','test3']

function make_request(query_arr){

    if (query_arr.length){

        let payload = JSON.stringify(query_arr[0]);
        let headers = new Headers();

        query_arr.splice(0,1);

        this.http.post('https://endpoint/post',payload,{headers:headers})
            .map((res:Response) => {make_request(query_arr)})

    }

}.subscribe(
    data => console.log('finished http request, moving on to next http request'),
    err => console.error(err),
    () => console.log('all http requests have been finished')
);

make_request(query_arr)

目标功能:

  • 需要知道每个响应的返回时间
  • 必须知道所有响应何时返回

最佳答案

您需要利用 flatMap 运算符来连续执行您的请求(一个接一个)。为此,您需要递归地构建数据处理链。这里的重点是在前一个可观察对象(前一个请求返回的那个)上调用操作符。

这样,请求将等待前一个请求完成,然后再执行。订阅时提供的回调将在所有请求执行后调用。

这是此方法的示例实现:

makeRequest(queryArr, previousObservable){
  if (queryArr.length) {
    let payload = JSON.stringify(queryArr[0]);
    let headers = new Headers();
    (...)

    queryArr.splice(0,1);

    var observable = null;
    if (previousObservable) {
      observable = previousObservable.flatMap(() => {
        return this.http.post('https://testsoapi.apispark.net/v1/entities', payload,{
            headers:headers
          })
          .map((res:Response) => res.json())
          .do(() => {
            console.log('request finished');
          });
      });
    } else {
      observable = this.http.post('https://testsoapi.apispark.net/v1/entities', payload, {
        headers:headers
      })
        .map((res:Response) => res.json())
        .do(() => {
          console.log('request finished');
        });
    }

    return this.makeRequest(queryArr, observable);
  } else {
    return previousObservable;
  }
}

这个方法最初可以这样调用:

test() {
  let queryArr = [
    { val: 'test1' },
    { val: 'test2' },
    { val: 'test3' }
  ];

  this.makeRequest(queryArr).subscribe(
    () => {
      console.log('all requests finished');
    });
}

查看此插件:https://plnkr.co/edit/adtWwckvhwXJgPDgCurQ?p=preview .

关于javascript - Angular 2 : Dynamic synchronous http requests,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36432280/

相关文章:

javascript - html5 拖放移动设备

javascript - 使用 three.js 自定义形状

http - 为什么我看不到 HttpUtility.ParseQueryString 方法?

java - 使用 Amazon Spot 实例(或其他方式)从 Java 代码发出多个 HTTP 请求

rest - 空结果 204 或 404 请求中的 HTTP 返回码是什么?

javascript - 如何获取firebase文件存储的下载Url

xml - 在 Angular 2 中将 XML 插入 DOM

javascript - Sencha Touch 日期代码在 Chrome 中运行良好,但在 Safari 中失败

javascript - 隐藏 iframe 以防止内部服务器错误

javascript - 如何在 TypeScript Angular 中使用外部 Javascript