2016-05-26 6 views
0

私の頭をラップすることができないチェーン/ラップObservables。私はservicemethodを持っているのVisual Studioで活字体でRxJsで2015ラップオブザーブ可能なメソッド

をAngular2のRC1を使用しています 'saveProduct' ProductServiceクラスで:

public saveProduct(product: Product): Observable<string> { 
    let options = new RequestOptions({ headers: new Headers({ 'Content-Type': 'application/json' }) }); 
    return this.http.post(this.config.apiUrl + '/product', JSON.stringify(product), options).map(this.extractData).catch(this.handleError); 
} 

私はangular2コンポーネントでそれを消費:

public save() { 
    this.productService.saveProduct(this.product).subscribe(
     result => this.productSaveExecuted(result), 
     error => this.handleError(error) 
    ); 
} 

コンポーネントがモーダルダイアログにラップされています。コンポーネントのsaveメソッドを呼び出した後にダイアログを閉じると、ダイアログが閉じられて保存アクションが完了します。ですから、私は、が成功した後に、を閉じたいモーダルdivウィジェットにコンポーネントがラップされているので、Observableを返すようにコンポーネントの保存関数を設定したいと考えています。これをどのように達成するのですか?このような

答えて

0

観測は、このような別の観測可能で「ラップ」することができます。

public save(): Observable<{}> { 
    console.log("productdetails.component save was called"); 

    return Observable.create(observer => { 
     this.productService.saveProduct(this.product).subscribe(
      result => this.productSaveExecuted(result), 
      error => this.handleError(error) 
     ); 
     observer.next(), 
     function (err) { 
      console.log('Error: ' + err); 
     }, 
     //call complete if you want to close this stream (like a promise) 
     observer.complete(); 
    }); 

} 

他のソリューションはproductService起因する観察可能に加入し、.toPromise()メソッドからの約束を返すようになります。

は私の学習プロセスを支援するためにあなたのNypanをありがとう:)

1

何か:

public save(): Rx.Observable<{ success: boolean }> { 
    return this.productService 
     .saveProduct(this.product) 
     .select(result => { 
      this.productSaveExecuted(result); 
      return { success: true }; 
     }) 
     .catch(error => { 
      this.handleError(error); 
      return Rx.Observable.return({ success: false }); 
     }); 
} 

save方法は、サブスクリプションで製品を保存しようとすることを観察できるが返されます。

save方法への登録:

save() 
    .subscribe(result => { 
     if(result.sucess) 
      // everything went well 
     else 
      // something went wrong 
    }) 

は、私は、これはあなたが欲しいものだと思う..あなたは、あなたの質問では完全には明らかではありません。

+0

私はあなたの答えは私が目指しています正確に何であると思いますが、ご返信いただきありがとうございます。ただし、VS2015はエラーを返します。 プロパティ 'select'がタイプ 'Observable 'に存在しません。 Angular2はrxjsのサブセットのみを使用しているようですか?ディレクトリnode_modules¥rx¥src¥core¥linq¥observable¥ でselect.jsが表示されます。これを私のAngular2クラスにどのようにインポートできますか? – Mcanic

+1

私はAngular2に非常に流暢ではありませんが、 'saveProduct'によって返された' Observable'が 'Rx.Observable'である場合、その上にselectが存在するはずです。出力タイプを 'Rx.Observable'に変更してみてください。うまくいかない場合は、ソリューションにRxjをさらに追加する必要があります(rx.all.jsとrx.all.d.tsにはすべてが含まれています)。 rxjsに関する一般的な情報についてはhttps://github.com/Reactive-Extensions/RxJSをご覧ください。 – Nypan

+0

仕事に就きましたか? – Nypan

関連する問題