2013-03-29 2 views
0

J'utilise Rx.js et JqueryPromises J'ai rencontré une situation où j'appelle une méthode pour traiter un événement publié par Rx. Cette méthode renvoie cependant une promesse.Comment combiner l'abonnement Rx.js avec Jquery Promise?

eventStream.Subscribe(function(e) { methodThatReturnsPromise(e);}); 

Le problème est que le traitement des événements n'est plus déterministe. Comme méthodeThatReturnsPromise renvoie immédiatement car il diffère le traitement.

Ma question :) Existe-t-il un moyen d '«attendre» une promesse? Existe-t-il des points d'ancrage permettant à Rx d'utiliser les promesses, c'est-à-dire d'enchaîner la promesse retournée d'un abonnement avec la prochaine promesse d'abonnement retournée, de sorte que les messages sont toujours traités dans l'ordre?

Répondre

0

Ce code semble faire l'affaire pour toute personne intéressée. J'ai juste besoin d'enchaîner les retours différés.

Fiddle here

var seed = $.Deferred(); 
seed.resolve(); 
observable.aggregate(seed, function(chain, n){ 
    return chain.then(function(){ 
     console.log("Starting on Event " + n); 
     return process(n); 
    }); 
}).subscribe(); 
+0

Si Rx a des méthodes qui renvoient deferrds/promesses, alors il doit soit avoir ses propres méthodes de traitement fait/échec/progrès, ou il est compatible avec jQuery/q (ou similaire) et jQuery/q les méthodes peuvent être appliquées. Le code ci-dessus peut très bien fonctionner mais il est difficile de voir comment 'seed' apporte une contribution, étant donné qu'il est résolu dès sa création. –

+0

Seed est juste la première valeur de la chaîne (sinon elle serait nulle, plus propre que les vérifications nulles pour moi). Cela doit être modifié pour permettre la continuité de cette chaîne sur les erreurs. –

+0

Ensuite, il est difficile de voir pourquoi vous avez besoin d'une chaîne. Ne pouvez-vous pas gérer la promesse d'intérêt sans construire une chaîne, dont le premier élément est garanti pour être résolu? Le chaînage semble être une élaboration inutile. –