2015-12-29 3 views
0

Я пытаюсь получить запрос POST на свой Сервер. Я хочу использовать его с 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' для отслеживания того, что передается в наблюдаемых. Сообщите нам, что вы нашли. – user3743222

+0

Ваш код выборки может быть неправильным, потому что вы не вызываете 'catch (observer.onerror)' на первое обещание. –

+1

Где вы понимаете, я пропустил catch()? В моем коде я всегда включаю его ... – 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(...) 

Не удается запустить этот код атм, но надеюсь, что общая суть ясна - как правило, это окупается, чтобы иметь меньшие, проверяемые наблюдаемые.

Смежные вопросы