2016-12-28 22 views
1

Observable.bindCallback私はそれに加入している場合にのみ値を返す直接 つまり、これは正常に動作します:Observable.bindCallbackにのみ値を返す直接

return this.store.select(store => store.appDb.appBaseUrl) 
      .take(1) 
      .mergeMap(baseUrl => { 
       const url = `${baseUrl}?command=GetCustomers&resellerUserName=aaa&resellerPassword=bbbb`; 
       return this.http.get(url) 
        .map(res => { 
         var xmlData = res.text() 
         const boundCallback = Observable.bindCallback(this.processXml, (xmlData: any) => xmlData); 
         return boundCallback(this, xmlData) 
          .subscribe((x) => { 
           return x; 
          }); 
        }) 
      }) 

しかし、私は、サブスクリプションを避けるために必要があります私は私のために@effect自動サブスクライブの内部で実行していますので、私は実行すると:

return this.store.select(store => store.appDb.appBaseUrl) 
      .take(1) 
      .mergeMap(baseUrl => { 
       const url = `${baseUrl}?command=GetCustomers&resellerUserName=aaa&resellerPassword=aaa`; 
       return this.http.get(url) 
        .map(res => { 
         var xmlData = res.text() 
         const boundCallback = Observable.bindCallback(this.processXml, (xmlData: any) => xmlData); 
         var d:any = boundCallback(this, xmlData) 
         return d; 
        }).map(d=>{console.log(d)}) 
      }) 

ではなく、今の値を取得、私は取得しています:

これがdである:私はあなたはそれが(明らかに私はそれをテストしていない)、このようになるはずです何をしたいのか理解していれば

enter image description here

よろしく

ショーン

+0

は何これはとにかくやることになっていますか?本当にmap()演算子から 'Observable'や' Subscription'を返そうとしていますか?ステートメント 'return x;' 'subscribe()'の中には何もしません。 – martin

+0

私は値を返す必要があります、this.processXmlはコールバックと値をとり、結果を返します。私は約束を得てPromiseObservableを取得しようとしましたが、値を取得しませんでした:/ – born2net

答えて

2

:私は0で返さ観測から値を取得したいので、

return this.store.select(store => store.appDb.appBaseUrl) 
      .take(1) 
      .mergeMap(baseUrl => { 
       const url = `${baseUrl}?command=GetCustomers&resellerUserName=aaa&resellerPassword=aaa`; 
       return this.http.get(url) 
        .mergeMap(res => { 
         var xmlData = res.text() 
         const boundCallback = Observable.bindCallback(this.processXml, (xmlData: any) => xmlData); 
         return boundCallback(this, xmlData) 
        }).do(d => console.log(d)) 
      }) 

は私がmergeMap()を使用しました。

map()を使用している場合は、は常にさらに伝播する値を返す必要があります。あなたの例では何も返されていないので、ちょうどdo()を使って何の価値があるかを見ることができます。

編集:

これはあなたのやっていることを単純化したものです。

class A { 
    private processXml(context, xmlData, cb) { 
     context.parseString(xmlData, {attrkey: 'attr'}, function (err, result) { 
      if (err || !result) return cb(null); return cb(result); 
     }) 
    } 

    private parseString(str, _, cb) { 
     return cb(null, str); 
    } 

    private mockHttpGet() { 
     return Rx.Observable.of({ 
      text:() => { 
       return 'abc'; 
      } 
     }); 
    } 

    test() { 
     return this.mockHttpGet() 
      .mergeMap(res => { 
       var xmlData = res.text(); 
       const boundCallback = Rx.Observable.bindCallback(this.processXml, (xmlData: any) => xmlData); 
       return boundCallback(this, xmlData) 
      }).do(d => console.log(d)) 
    } 
} 

let a = new A(); 
a.test().subscribe(val => console.log('subscribed result', val)); 

はライブデモを参照してください:https://jsbin.com/reweraw/2/edit?js,console

このデモプリント:あなたがそれらに加入するまで

abc 
subscribe abc 

BoundCallbackObservableは(これは、同様の演算子に適用されます)何もしません。そのため、デバッガでは生データだけが表示されます。

私のデモはおそらく欲しいので、mergeMap()を使用して、ネストされたObservableから実際の値を取得し、同じロジックをアプリケーションに複製しようとします。

+0

返信のためのtxですが、 '' 'd'''にヌルを返します:( – born2net

+1

@ born2net' processXml'メソッドが返すものを確認し、 Btwは 'Observable.bindCallback'を全く使用せず、' this.processXml(xmlData) '(またはあなたが使っているもの)を返すだけですが、 – martin

+0

でもこれは受け取ります。processXml(xmlData)は私の関数ではなく、コールバックを受け取ります – born2net

0

が解決策を見つけ、私はあまりにも深い1台のOBSた:

return this.store.select(store => store.appDb.appBaseUrl) 
      .take(1) 
      .mergeMap(baseUrl => { 
       const url = `${baseUrl}?command=GetCustomers&[email protected]&resellerPassword=XXXX`; 
       return this.http.get(url) 
        .map(res => { 
         return res.text() 
        }).flatMap(jData=>{ 
         const boundCallback = Observable.bindCallback(this.processXml, (xmlData: any) => xmlData); 
         return boundCallback(this, jData) 
        }).map(businessData=>{ 
         return businessData; 
        }) 
      }) 
関連する問題