gpt4 book ai didi

ruby - Wisper 和 Grape 从 POST 请求返回结果

转载 作者:数据小太阳 更新时间:2023-10-29 07:59:16 26 4
gpt4 key购买 nike

我有一个简单的 POST Grape 端点,后台带有 Wisper 发布/订阅:

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 的 post :now 端点时用 JSON {result: "42"} 响应.

不幸的是,它不是这样工作的,我所拥有的是:

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

Wisper 的 wiki 中的那个例子帮助不大 (https://github.com/krisleech/wisper/wiki/Grape)

关于如何通过 Grape 的端点调用实际传递 SomePub#do_calculations 结果有什么想法吗?

最佳答案

PubSub 模式的要点是发布者完全不知道它的订阅者。您想要实现的是将订阅者的结果传递回发布者,这与所有想法背道而驰。

但是,您可以做的是让您的订阅者也成为发布者,并在单独的订阅者中收集响应。

请注意,这是示例代码,因为我手头没有安装 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

关于ruby - Wisper 和 Grape 从 POST 请求返回结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32082288/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com