observable forkjoin永远不会执行可观察的angular2
问题描述:
我试图使用forkJoin
执行多个XHR请求(在getImages
函数中),每个请求都包含在可观察对象(在getImage
函数内)中。然而,没有任何请求被执行,即从不执行observer.next()
。我曾尝试使用zip
而不是forkJoin
,但这也不起作用。我确信我可以在我创建的所有观察对象上都有complete
。observable forkjoin永远不会执行可观察的angular2
getImages(urls: string[]) {
Observable.forkJoin(...urls.map(url => {return this.getImage(url)}))
.subscribe(
(result) => {console.log(result)},
(err) => {console.log(err)},
() => {});
}
private getImage(url: string): Observable<string> {
let xhr = new XMLHttpRequest();
return Observable.create((observer => {
xhr.onreadystatechange =() => {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
observer.next(xhr.response);
} else {
observer.error(xhr.response);
}
observer.complete();
}
}
xhr.responseType = "blob";
xhr.open("GET", url, true);
}))
}
答
不使用XMLHttpRequest不够熟悉,但是从你的诊断,我已经看到了它的使用的样品,我想,你没有达到的readyState的4(DONE),因为你已经不叫xhr.send( )。
从示例中列出@https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/onreadystatechange
var xhr = new XMLHttpRequest(),
method = "GET",
url = "https://developer.mozilla.org/";
xhr.open(method, url, true);
xhr.onreadystatechange = function() {
if(xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) {
console.log(xhr.responseText);
}
};
xhr.send();
所以我想你可能要修改你的代码:
return Observable.create((observer => {
xhr.onreadystatechange =() => {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
observer.next(xhr.response);
} else {
observer.error(xhr.response);
}
observer.complete();
}
}
xhr.responseType = "blob";
xhr.open("GET", url, true);
xhr.send();
}))
谢谢主席先生!我没有用过很多。 – quantdaddy