您好亲爱的程序员同伴,我想使用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进行学校项目,我真的需要你的帮助,我想映射所有回复我的回复=“问候!”。
谢谢。
答案 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
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 })));