我正在使用forkJoin
的可观测量,但我在我的可观察量中传递参数时遇到了麻烦。代码行价值千言万语:
for(var key in pdfObjects){
let pdf = {pdfObjects[key]};
observables.push(new Observable(observer => {
this.createPDF(pdf).subscribe((pdfFile) => {
// Do something with my pdfFile
observer.complete();
})
})
}
Observable.forkJoin(observables).subscribe(
(next) => {},
(error) => {},
(completed) => {
console.log('completed');
}
);
(为了更清晰,我简化了代码)
正如您在此处所看到的,问题是当代码执行observable时,pdf
变量等于最后pdfObjects
,而不是每个observable的不同变量。
问题是如何“传递”和“复制”我的pdf
变量,因此对于每个可观察变量都是不同的?
答案 0 :(得分:4)
您应该使用next
方法而不是complete
方法:
observables.push(new Observable(observer => {
this.createPDF(pdf).subscribe((pdfFile) => {
// Do something with my pdfFile
observer.next(pdf); // <-----
});
})
修改强>
您的问题与循环中闭包的使用有关。
你可以打破方法:
createObservable(pdf:any) {
return new Observable(observer => {
this.createPDF(pdf).subscribe((pdfFile) => {
// Do something with my pdfFile
observer.complete();
});
});
}
otherMethod() {
for(var key in pdfObjects){
let pdf = {pdfObjects[key]};
observables.push(this.createObservable(pdf));
}
(...)
}
有关详细信息,请参阅此问题:
请参阅此plunkr:https://plnkr.co/edit/P4BfwnA1HEw7KU4i3RbN?p=preview。
答案 1 :(得分:0)
@Thierry是对的,这是一个展示正在进行的事情的例子(fiddle)
var pdfObjects = {
a: 'Object A',
b: 'Object B',
c: 'Object C'
};
for(let key in pdfObjects) {
let pdf = pdfObjects[key];
function createObservable(p) {
console.log('createObservable:', p, pdf, key);
return Rx.Observable.create(observer => {
console.log('createObservable.create:', p, pdf, key);
observer.onNext({ p: p, pdf: pdf, key: key});
observer.onCompleted();
});
}
observables.push(createObservable(pdf));
}
结果:
createObservable: Object A Object A a
createObservable: Object B Object B b
createObservable: Object C Object C c
createObservable.create: Object A Object C c
createObservable.create: Object B Object C c
createObservable.create: Object C Object C c
调用createObservable
时,每个值都如您所料。但是当你订阅你的observable时,带有observer
的匿名函数被RxJs调用,并使用pdf
和key
的当前值,这是他们最后一次通过环。但是因为你正在创建一个函数,所以有一个新的范围和参数&#39; p&#39;在该范围内是调用函数的值。