2017-09-05 3 views
4

함수를 만들면 관찰 할 수있는 결과를 얻는 데 약간의 도움이 필요합니다. 함수 (전화가 mainFunction), 비동기 함수 (호출하자 getAsyncWithCallback) 호출하고 콜백을 실행합니다. 콜백의 일부는 관찰 가능 객체를 반환하는 비동기 호출입니다 (getData이라고 부름).RxJS Merge Callback에서 관찰 가능

getAsyncWithCallback은 (는) 라이브러리의 일부이며 변경할 수 없습니다. 이것은 내가하고 싶은 것입니다

mainFunction(){ 
    getAsyncWithCallback(() => { 
     let myObservable = getData(); 
    }); 
} 

:

mainFunction().subscribe((data) => { 
    // data is the data from getData() 
}); 

이를 달성하는 가장 좋은 방법은 무엇입니까, 체인 오류 및 준공을 형성

내가 가진 무엇 안의?

+0

만약 그들이'myObservable'을 반환하지 않는다면 (또는 어딘가에 할당하면), 당신이 할 수있는 일이 많이 있다고 생각하지 않습니다. – acdcjunior

+0

나는 당신이 약속을 사용하고 그것을 관측 가능으로 변환 할 수 있다고 확신합니다. 나는 당신에게 예제를 제공하는 IDE atm이 없다. – MistyK

+0

콜백은 내가 변경할 수있는 코드입니다. 나는 거기에'myObservable'을 정의했다. – Grey

답변

1

내 솔루션 :

mainFunction(): Observable<any> { 

    return Rx.Observable.create(observer => { 
     getAsyncWithCallback((): void => { 
      getData().subscribe(observer); 
     }) 
    }) 
} 

mainFunction().subscribe((data) => { 
    console.log(data); 
})); 
+0

그것은'getData'가'Observable'을 반환하기 때문에 관찰 가능 객체를 관찰 할 수있게 만듭니다. 나는 당신이 어딘가에'mergeMap/flatMap'을 던질 필요가 있다고 생각합니다. – Pace

+0

나는 그것을 관찰 할 수있는 값으로 되돌려 놓았는데, 왜 병합이나 평면지도가 궁금한가요? – Rex

+1

@Pace로 operator를 사용하는 대신에'getData(). subscribe (observer)'를 쓰는 것이 더 낫다고 제안했다. –

0

당신은 mainFunction에서 관찰 가능한을 반환 할 것입니다. GetData의는 관찰 가능한 아닌 객체의 다른 유형을 반환하는 경우

, 당신은 Observable.create 함께 자신의 관찰 가능한을 구성합니다 :

function mainFunction() { 
    return Observable.create((obs) => { 
    getAsyncWithCallback(() => { 
     getData() 
     .subscribe((data) => { obs.next(data); }) 
     .catch((err) => { obs.error(err) }); 
    }); 
    }); 
} 

mainFunction().subscribe(data => console.log(data)); 

를 문서에서 :

생성

가에 onSubscription 기능을 변환 실제 Observable. 누군가가 Observable을 구독 할 때마다 함수는 Observer 인스턴스를 첫 번째이자 유일한 매개 변수로 호출합니다.

다음 값을 호출하면 해당 값이 관찰자에게 방출됩니다.

대부분의 경우 기존 연산자를 사용하면 대부분의 사용 사례에 대해 관찰 가능을 만들 수 있기 때문에 create를 사용하지 않아도됩니다. 즉, 매우 구체적인 요구 사항이있는 경우 create는 낮은 수준의 메커니즘으로 Observable을 만들 수 있습니다.

배열, 배열 모양의 개체, 반복기, 관찰 가능한 개체 및 약속에서 Observables를 만드는 Observable.from도 있습니다.

+0

첫 번째 옵션은'getAsyncWithCallback()'을 호출해야하므로이 문제를 해결하지 못합니다. 두 번째 옵션은 오류 및 완료를 연결하지 않습니다. 이 질문을 내 질문에 추가합니다. – Grey

+1

@Grey 당신이 무엇을 의미하는지 확실하지 않은 경우, 콜백의 실패 사례를 처리하지 않고 있지만, 이것은 좋은 시작이되어야합니다. obs.error() 또는 obs.complete()를 사용하여 신호를 보내면됩니다. 관찰 대상의 오류 또는 완료. –

+0

@RudolfOlah'.subscribe' 다음에'.catch'를 실행할 수없고 완료를 보내지 않습니다. @OlesSavluk thx, 다른 사람의 대답 –

관련 문제