2015-07-13 4 views
0

J'ai une application web où j'utilise Rx.js pour gérer les flux d'événements. L'application utilise un rest api fourni par un backend.Rx.js et le flux de travail d'application

Généralement je fais un abonnement pour un appel api et quand une demande est faite, je rends les résultats et réinitialise les autres états de contrôles (masquer les éléments de progression et ainsi de suite).

Certains appels api peuvent échouer lorsqu'un jeton d'authentification a expiré et que je dois obliger un utilisateur à se reconnecter (afficher une fenêtre de connexion ou autre).

Je suis curieux de savoir s'il existe un moyen de "restaurer" un flux d'appels api après une connexion réussie? Lorsqu'un utilisateur n'a pas à fournir d'actions supplémentaires pour obtenir une réponse du serveur.

exemple primitif du flux de travail actuel:

var apiCallStream = $.ajaxAsObservable(params): 
apiCallStream.subscribe(
    result => renderResult(result), 
    err => handleError(err)); 

function handleError(err) { 
    if (err.xhr.error === 401) { 
    LoginPopup(); 
    } else { 
    ErrorPopup(err); 
    } 
} 
+0

Avez-vous un code pour voir ce que vous avez jusqu'à présent? – paulpdaniels

+0

Ajouté un exemple – shadeglare

Répondre

2

Voici quelques uns (pseudo-code très rugueux), mais vous pouvez le faire avec retryWhen:

// use Rx.DOM.get for an Observable Ajax GET 
var source = Rx.DOM.get('/some/end/point') 
    .retryWhen(function(errors) { 
    // retryWhen: errors is a stream of errors 
    // whatever observable you return, when it emits, the 
    // observable you're operating on will be retried. (the entire thing) 
    return errors.filter(function(e) { return e.status === 401; }) 
     // if status is 401, then tell the user to login 
     .flatMapLatest(function() { return doUserLogin; }); 
    }); 

// a contrived observable that shows a form and 
// return a stream of successful logins 
var doUserLogin = Observable.create(function(observer) { 
    // show a form 
    var form = $('.my-form').show(); 
    // when submit is fired on said form... 
    return Rx.Observable.fromEvent(form, 'submit') 
    // send a login over ajax 
    .flatMap(e => Rx.DOM.post('some/url/login', form.serialize())) 
}); 

Espérons que vous donne quelque chose à Commencer avec.