2016-06-13 5 views
0

관찰 가능 항목 forkJoin을 사용하고 있지만 observables에서 인수를 전달하는 데 문제가 있습니다. 가치가 코드의 라인 천개의 단어 :옵저버블 배열에 인수 전달

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 변수가 있다는 것입니다,

(I 더 나은 명확성을 위해 코드를 단순화) 각 관찰 대상에 대해 다른 변수가 아닌 마지막 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 하나의 next 메소드를 호출 할 필요가 있습니다.

당신은 방법 깨질 수 :

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

은 자세한 내용은이 질문을 참조 : https://plnkr.co/edit/P4BfwnA1HEw7KU4i3RbN?p=preview :

이 plunkr를 참조하십시오.

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

관측 값에 다른 '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'가있는 경우 함수가 호출 된 값입니다.