如何使用异步任务执行多个请求,因为我知道何时完成所有请求

时间:2017-05-16 17:40:38

标签: javascript angularjs promise ionic2 httprequest

您好亲爱的程序员同伴,我想使用promises做多个http请求,知道什么时候http请求完成,我有这个代码,但不起作用,我去这里寻求帮助。

这是我的代码:

    promisesMappingIp(){
  var promises = [];
  for(var i = 1; i < 255; i++){
    promises.push(this.http.get(`http://192.168.1.`+i+`/hello`).map((res:Response) => {
            try{
              return res.json();
            }catch(err){
              return {};
            }
          }));
  }

  Promise.all(promises).then(function(){
    promises.forEach((x) =>{
      x.subscribe(data => {

      });
    });
  }).catch((err) =>{
    console.error(err);
  });
}

在我的控制台中抛出了这个错误:

ERROR Object {_body:error,status:0,ok:false,statusText:“”,headers:Object,type:3,url:null}

我正在使用Ionic 2进行学校项目,我真的需要你的帮助,我想映射所有回复我的回复=“问候!”。

谢谢。

3 个答案:

答案 0 :(得分:1)

我已经使用XMLhttprequest解决了我的问题,这是我的代码,我希望这可以帮助任何有同样问题的人:

    getService(ip: string, param: string): Promise<any> {
     let url: string = `http://${ip}/${param}`;
     return new Promise((r,j) =>{
     var xhr = new XMLHttpRequest();
     xhr.open("GET", url, true);
     xhr.onload = function(e){
       if (xhr.readyState === 4) {
         r(ip);
       }
     }
     xhr.onerror = function(err){
       r(null);
     }
     xhr.send(null);
   });
 }

这是我用来打电话的方法:

  getIpList(){
  let promises = [];
  for(var i = 1; i < 255; i++){
  promises.push(this.nodeProvider.getService(`192.168.1.${i}`, 'hello'));
  }
  Promise.all(promises).then((arrayIp) => {
   let clean = arrayIp.filter(ip => !!ip);
  });
}

我希望我能解决你的问题

答案 1 :(得分:0)

您可以使用Observable

发送多个http请求
import {Observable} from 'rxjs/Rx';

promisesMappingIp() {
    var promises = [];
    for (var i = 1; i < 255; i++) {

        promises.push(this.http.get(`http://192.168.1.` + i + `/hello`));
    }

    Observable.forkJoin(promises)
        .subscribe((response) => {
            console.log(response[0]);
            console.log(response[1]);
        });
}

答案 2 :(得分:0)

Promise.all()快速失败。这意味着一旦第一个承诺失败,它就会失败。

您需要拦截失败并且不要传播它,如下所示:

promises.push(this.http.get(`http://192.168.1.`+i+`/hello`).map((res:Response) => {
            try{
              return res.json();
            }catch(err){
              return {};
            }
          }).catch(err=> ({ error: err })));