2015-08-18 4 views
3

J'ai simple point final POST raisin avec Wisper pub/sous en arrière-plan:Wisper et raisin résultats de retour d'une requête POST

module Something 
    class Doit < Grape::API 
    post :now do 
     service = SomePub.new 
     service.subscribe(SomeSub.new) 
     service.call(params) 
    end 
    end 
end 

Voici le SomeSub où en fait les calculs Happens:

class SomeSub 
    def do_calculations(payload) 
    {result: "42"}.to_json 
    end 
end 

SomePub est tout aussi simple:

class SomePub 
    include Wisper::Publisher 

    def call(payload) 
    broadcast(:do_calculations, payload) 
    end 
end 

Donc, ce dont j'ai besoin est pour répondre avec le JSON {result: "42"}, lors de l'appel du point de terminaison post :now de Grape.

Malheureusement, il ne fonctionne pas de cette façon, et ce que j'ai est:

{"local_registrations":[{"listener":{},"on":{},"with":null,"prefix":"","allowed_classes":[],"broadcaster":{}}]} 

Cet exemple de wiki de Wisper ne vous aide pas trop (https://github.com/krisleech/wisper/wiki/Grape)

Toute idée comment passer réellement SomePub#do_calculations résultats, à la suite de l'appel de point de terminaison de Grape?

+1

Peut-être pub/sous est approprite pas pour cette édition est depuis tirer et oublier, il n'y a pas de valeur de retour. Je suggère au service de renvoyer une valeur qui est ensuite transformée en JSON, par ex. 'MyJSONSerializer.new (MyService.call (params))' – Kris

+0

En fait, cela * est * feu et oublier, et je suis juste en train de déclencher un même invoquer des calculs –

+0

Dans la question, vous dites que vous devez répondre à la poste avec le résultat de l'abonné, suis-je mal interprété? – Kris

Répondre

3

Le point de modèle PubSub est que Publisher est complètement ne pas au courant de ses abonnés. Ce que vous essayez de faire, c'est de renvoyer le résultat de l'Abonné à Publisher, ce qui va à l'encontre de toute l'idée.

Ce que vous pouvez faire, cependant, est de faire de votre abonné un éditeur et de recueillir des réponses dans un abonné distinct.

S'il vous plaît, notez que c'est un exemple de code que je n'ai pas installé de raisin à la main (mais, espérons-le, il fonctionne):

class ResponseListener 
    attr_reader :response 

    def initialize 
    @response = {} 
    end 

    def collect_response(item) 
    @response.merge!(item) # customize as you wish 
    end 
end 

class SomeSub 
    include Wisper::Publisher 

    def do_calculations(payload) 
    broadcast(:collect_response, result: "42") 
    end 
end 

module Something 
    class Doit < Grape::API 
    post :now do 
     response_listener = ResponseListener.new 
     # globally subscribe response_listener to all events it can respond to 
     Wisper.subscribe(response_listener) 

     service = SomePub.new 
     service.subscribe(SomeSub.new) 
     service.call(params) 

     response_listener.response.to_json # render collected response 
    end 
    end 
end