2015-12-29 101 views
0

我試圖獲取請求後到我的服務器。我想用它與RxJS更好地概述我的響應數據。現在,我可以正確地使用它有問題......使用RxJS正確地讀取請求

我叫RxJS的按鈕後,我的分量取單擊我在給它一些參數:

_btnSendCode: function() { 
    var self = this; 
    var RelationShipModel = require('../NetworkUtils/RelationShipModel'); 
    var relationShipType = RelationShipModel(currentIndex); 
    var InvitationAction = require('../../../Flux/Actions/InvitationAction'); 
    InvitationAction.createInvitation(this.state.familyID, relationShipType, this.state.adminSwitch, AuthStore.getUserTokenWithBearer()); 
    //self.props.navigator.pop(); 
} 

這裏是我的createInvitation:

var Rx = require('rx'); 

function notifyMessage(msg:string) { 
    if (Platform.OS === 'android') { 
     ToastAndroid.show(msg, ToastAndroid.SHORT) 
    } else { 
     AlertIOS.alert(msg); 
    } 
} 

createInvitation: function (familyID, type, isAdmin, userToken) { 
    let source = Rx.Observable.create(function (observer) { 
     fetch(API_URL + 'families/' + familyID + '/invitations', { 
      method: 'POST', 
      headers: {'Authorization': userToken, 'Content-Type': 'application/json'}, 
      body: JSON.stringify({ 
       'type': type, 
       'isAdmin': isAdmin 
      }) 
     }).then(res => res.json()) 
      .then(j => { 
       observer.onNext(j); 
       observer.onCompleted(); 
      }).catch(observer.onError); 
    }).flatMap(function (array) { 
     return Rx.Observable.from(array); 
    }); 

    let subscription = source.subscribe(
     function (x) { 
      console.log('onNext: %s', x); 
      //Dispatcher.dispatch({ 
      // actionType: ActionTypes.CREATE_INVITATION, 
      // data: JSON.parse(response._bodyText) 
      //}); 
     }, 
     function (e) { 
      console.log('onError: %s', e); 
      notifyMessage(e.message); 
     }, 
     function() { 
      console.log('onCompleted'); 
     } 
    ); 

    console.log(subscription); 

所以問題是,onNext,onError或onCompleted永遠不會被執行。可能是什麼問題呢?我的抓取響應應該是正確的。但即使它不是正確的,我不應該在我的onError中得到錯誤消息嗎?

+0

您是否嘗試過調試,看看正在執行什麼代碼的一部分,哪部分不?你處理的承諾,如果承諾不解決,你是左掛,所以日誌跟蹤你的代碼。對於Rxjs,您可以使用「tap」運算符來跟蹤在observables中傳遞的內容。讓我們知道你發現了什麼。 – user3743222

+0

你取的代碼可能是不正確的,因爲你不是叫'抓(observer.onerror)'第一個承諾。 –

+1

如果你的意思是我錯過了趕上()?在我的代碼中,我總是包含它... – BigPun86

回答

1

您的代碼可能在未觸發時中斷observer.onError如果JSON.stringify觸發異常,例如嘗試序列化具有循環數據結構的對象。

不是說是一個實際的問題,讓我們嘗試打破你的問題分成更小的可測試塊,那麼至少我們可以知道哪些部分保留失敗以及爲什麼。

另外,我建議拆分代碼成更小的觀測,進行錯誤處理稍微簡單:

const body$ = Observable.create(obs => { 
    try { 
     const body = JSON.stringify({type: ..., isAdmin: ...}) 
     obs.onNext(body) 
     obs.onCompleted() 
    } catch (err) { 
     obs.onError(err) 
    } 

}) 
const request$ = body$.flatMap(
         body => Observable.of(fetch(..., {body, ...})) 
        ) 
        .do(...) // start with this if still having issues 
        .catch(...) // you should be able to drop this one later 

const source$ = request$.flatMap(
    res => Observable.of(res.json()) 
).catch(...) 

source$.subscribe(...) 

不能ATM運行這段代碼,但希望廣大要旨是明確的 - 它通常回報有更小的,可測試的可觀察量。