我有一个简单的葡萄树后端点,背景是wisper pub/sub:
module Something
class Doit < Grape::API
post :now do
service = SomePub.new
service.subscribe(SomeSub.new)
service.call(params)
end
end
end
这里是实际计算发生的
SomeSub
:class SomeSub
def do_calculations(payload)
{result: "42"}.to_json
end
end
SomePub
也很简单:class SomePub
include Wisper::Publisher
def call(payload)
broadcast(:do_calculations, payload)
end
end
所以我需要的是在调用grape的
{result: "42"}
端点时用jsonpost :now
响应。不幸的是,它不是这样工作的,我所拥有的是:
{"local_registrations":[{"listener":{},"on":{},"with":null,"prefix":"","allowed_classes":[],"broadcaster":{}}]}
Wisper的wiki上的这个例子没有太大帮助(https://github.com/krisleech/wisper/wiki/Grape)
有什么想法可以通过grape的端点调用实际传递
SomePub#do_calculations
结果吗? 最佳答案
pubsub模式的要点是publisher完全不知道它的订阅者。你所要达到的目的是把订户的结果传给出版商,这与所有的想法背道而驰。
但是,您可以做的是使订阅服务器同时成为发布服务器,并在单独的订阅服务器中收集响应。
请注意,这是示例代码,因为我手头没有安装grape(但希望它能工作):
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