2016-06-13 6 views
0

私はオブザーバブルの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'); 
    } 
); 

(私はより明確にするためのコードを簡素化している)

あなたがここに見ることができるように、問題はコードが観測を実行したときに、pdf変数であるということです各観測値に対して異なる変数ではなく、最後のpdfObjectsに等しくなります。

質問は私のpdf変数をどのように '渡し'、 'コピー'すればよいのですか?

observables.push(new Observable(observer => { 
    this.createPDF(pdf).subscribe((pdfFile) => { 
    // Do something with my pdfFile 
    observer.next(pdf); // <----- 
    }); 
}) 

編集

あなたの問題は、ループ内でクロージャの使用に関連している:

+0

値を「let」の中に囲み、「pdfObjects」というキーを持つ新しいオブジェクトを作成することを意味しましたか、簡略化するときに誤植ですか? –

答えて

3

あなたが代わりにcomplete 1のnextメソッドを呼び出す必要があります。

あなたはこの方法で破ることができます:https://plnkr.co/edit/P4BfwnA1HEw7KU4i3RbN?p=preview:このplunkrを参照してください

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)); 
    } 
    (...) 
} 

は、より多くの詳細については、この質問を参照してください。

createObservableが呼び出される
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 

あなたが期待するように、各値は次のとおりです。

+0

ありがとうございますが、ここで問題は解決しません... 'observer.next()'は単に 'forkJoin'の' subscribe'のpdf値を返します!私が必要とするのは、各観測値がそれ自身の 'pdf'変数を引数として持つことです。 – ncohen

+0

私はあなたの問題がループ内のクロージャーの使用に関連していると思います。私はそれに応じて私の答えを更新しました... –

+0

observablesには異なる 'pdf'引数がありますか?私が見ている問題は 'pdf'参照で関数をプッシュしていて、その参照が' forkJoin'によって実行されるときに変更されます(最後のpdfObjects項目と同じになります)。 – ncohen

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)); 
} 

の検索結果を表示する例を示します、右です。しかし、あなたが観測値を購読するときには、observerという匿名関数がRxJsによって呼び出され、ループの最後の時刻であるpdfkeyの現在の値を使用しています。しかし、関数を作成しているので、新しいスコープがあり、スコープ内の引数 'p'は関数が呼び出された値です。

関連する問題