2017-08-06 4 views
1

私はdo文でObservableを返そうとしています。何らかの理由でdoステートメントが呼び出されません。 すべてのヘルプはappreicatedされます。RXJS - Observable.doが動作していません

public addTarget(video: VideoFile, language?: Language): Observable<Language> { 
 
    if (!this.isTargetCollectionDeclared(video)) { 
 
     video.metadata = video.metadata || <BaseVideoData>{}; 
 
     video.metadata.to = []; 
 
    } 
 

 
    let wasLanguageProvided = language != null; 
 
    if (wasLanguageProvided) { 
 
     video.metadata.to.push(language); 
 
     return Observable.of(language); 
 
    } 
 

 
    return this._getDefaultFromAvilableLanguages(video) 
 
     .do(languageOrNull => { 
 
      // code is not reaching her 
 
      if (languageOrNull != null) { 
 
      video.metadata.to.push(languageOrNull) 
 
      } 
 
     }) 
 
    }

+0

あなたは観測可能なものを購読していますか? – echonax

+1

どのように 'addTarget'を呼び出しますか? –

+0

addTarget()() – Milad

答えて

1

観測は、関数のように、怠け者です。彼らはあなたがそれらに電話をかけるまで関数がどのように実行されないのかと同様に、それらを購読しない限り実行しません。

observableが起動すると、.doにコールバックが渡されます。これは、あなたが購読した後にのみ発生する可能性があります。

+0

OPは既にメソッドが購読されているコメントに記載されています.. – echonax

+1

私の間違い。それは別の場所から見られた。 –

+1

@ user3554268ありがとうございます。この回答があなたの問題をどのように解決しますか?自分のタイプミスである場合は、その質問を削除する必要があります。 – echonax

0

非同期内部_getDefaultFromAvilableLanguages関数が値を発信した後にのみ、関数内で作成された.do()演算子内の入力引数videoを変更すると、かなり厄介です。

これは、ビデオオブジェクトに存在する言語に関して予測競争条件をデバッグするのが困難になる可能性があります。元の入力VideoFileは、この関数の内部変更されますが、少なくとも、あなたがそのことを確認するのに役立ちますので、これはまだ少し臭いです

function enrichVideoWithLanguage(video: VideoFile, language?: Language): Observable<VideoFile> { 
    // make sure the metadata object is in the expected state 
    if (!this.isTargetCollectionDeclared(video)) { 
    video.metadata = video.metadata || <BaseVideoData>{}; 
    video.metadata.to = []; 
    } 

    return Observable.of(video) 
    .mergeMap(
     (video) => { 
     if(language) { 
      return Observable.of(language) 
      .toArray(); 
     } 
     return this._getDefaultFromAvilableLanguages(video) 
      .filter(lang => lang != null) 
      .toArray() 
     }, 
     (video, languages: Language[]) => { 
     // we used toArray to only modify the video object once 
     languages.forEach(lang => video.metadata.to.push(language)); 
     return video; 
     } 
    ); 
} 

:私はあなたが更新されVideoFileを、これはより純粋であることをリファクタリングして返すことを示唆していますenrichVideoWithLanguageによって放出されるvideoFileには、放出後すぐに予想される言語値が含まれます。

関連する問題