将参数传递给可观察数组

时间:2016-06-13 05:26:35

标签: javascript angular rxjs observable

我正在使用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变量,因此对于每个可观察变量都是不同的?

2 个答案:

答案 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调用,并使用pdfkey的当前值,这是他们最后一次通过环。但是因为你正在创建一个函数,所以有一个新的范围和参数&#39; p&#39;在该范围内是调用函数的值。