等待发出的消息的响应?
Wait for response from emitted message?
我无法理解以下概念。
我正在发送 OSC 消息以查询 Ableton 中仪器的状态,因此我有 emmiter/receiver 组合正在进行。现在,事情是我想避免必须保持某种全局状态并围绕它包装所有内容。
我确实按照以下方式与 Ableto 交流:
sender.emit("/live/device", queryData);
receiver.on("/live/device", function(responseData){
// process response here...
})
所以你可以看出我不太确定我何时取回数据并且无法真正根据响应对新查询进行排序。
我想做的只是
query number of instruments on ONE certain channel
get number back
query parameters of each instrument of that channel based on first query
receive parameters back
但问题是我不知道如何包装 eventListeners 以响应这些查询,或者更确切地说如何以非阻塞方式对它们进行排序,但仍然避免出现某种全局状态。
查询数据并存储要由 eventListener 解析的 Promise 似乎是一种解决方案,但后来我陷入了如何将它们传回序列的问题。
经过一些研究,这种行为似乎打破了事件侦听器的整个概念,但我想关键是要有一些全局状态来跟踪正在发生的事情,对吧?
事件侦听器告诉您一些来自用户操作或任何其他中断的异步操作。根据您面临的 API,他们可能会重新使用事件侦听器进行回复,而不是为发送 API 提供承诺或回调 return。如果服务器有多个客户端与之交互,它可能希望在状态发生变化时同时通知所有客户端。
如果您确定无法直接在 send 方法中提供回调以回复您的请求,或者请求未产生在某个时候通过回复解决的承诺,通常有解决方法。
选项 1:发送上下文,接收回来
有 API 允许将 "context" 对象或字符串发送到 API。每当 API 回答这个特定问题及其负载时,它就会将此上下文发送给事件侦听器。这样,可以检查其有效负载的上下文部分是否是请求的答案。然后,您可以为更直接的 send/reply 模式编写自己的小包装函数。
选项 2:找出结果数据,如果它符合您的要求
如果生成的数据有特定的匹配项,例如 JSON 对象上的键,则可能会找出请求的内容。
选项 3:使用您身边的状态来跟踪一切
在大多数情况下,我看到这样的 APIs,服务器不太关心请求,只有在被某种请求改变时才发送它们的当前状态。客户端需要通过监听所有事件来复制服务器的状态,如果它想显示当前服务器状态。
在我遇到这个问题的大多数情况下,我考虑过选项 1 或 2,但最终还是选择了选项 3:其他客户端或硬件交换机可能会干扰我的客户端 UI 并更改服务器状态而不用我在听那个变化。这样我就会丢失使我的 UI 无效的信息,所以我无论如何都需要收听和复制 server/machine/hardware 的状态。
我无法理解以下概念。
我正在发送 OSC 消息以查询 Ableton 中仪器的状态,因此我有 emmiter/receiver 组合正在进行。现在,事情是我想避免必须保持某种全局状态并围绕它包装所有内容。 我确实按照以下方式与 Ableto 交流:
sender.emit("/live/device", queryData);
receiver.on("/live/device", function(responseData){
// process response here...
})
所以你可以看出我不太确定我何时取回数据并且无法真正根据响应对新查询进行排序。
我想做的只是
query number of instruments on ONE certain channel
get number back
query parameters of each instrument of that channel based on first query
receive parameters back
但问题是我不知道如何包装 eventListeners 以响应这些查询,或者更确切地说如何以非阻塞方式对它们进行排序,但仍然避免出现某种全局状态。
查询数据并存储要由 eventListener 解析的 Promise 似乎是一种解决方案,但后来我陷入了如何将它们传回序列的问题。
经过一些研究,这种行为似乎打破了事件侦听器的整个概念,但我想关键是要有一些全局状态来跟踪正在发生的事情,对吧?
事件侦听器告诉您一些来自用户操作或任何其他中断的异步操作。根据您面临的 API,他们可能会重新使用事件侦听器进行回复,而不是为发送 API 提供承诺或回调 return。如果服务器有多个客户端与之交互,它可能希望在状态发生变化时同时通知所有客户端。
如果您确定无法直接在 send 方法中提供回调以回复您的请求,或者请求未产生在某个时候通过回复解决的承诺,通常有解决方法。
选项 1:发送上下文,接收回来
有 API 允许将 "context" 对象或字符串发送到 API。每当 API 回答这个特定问题及其负载时,它就会将此上下文发送给事件侦听器。这样,可以检查其有效负载的上下文部分是否是请求的答案。然后,您可以为更直接的 send/reply 模式编写自己的小包装函数。
选项 2:找出结果数据,如果它符合您的要求
如果生成的数据有特定的匹配项,例如 JSON 对象上的键,则可能会找出请求的内容。
选项 3:使用您身边的状态来跟踪一切
在大多数情况下,我看到这样的 APIs,服务器不太关心请求,只有在被某种请求改变时才发送它们的当前状态。客户端需要通过监听所有事件来复制服务器的状态,如果它想显示当前服务器状态。
在我遇到这个问题的大多数情况下,我考虑过选项 1 或 2,但最终还是选择了选项 3:其他客户端或硬件交换机可能会干扰我的客户端 UI 并更改服务器状态而不用我在听那个变化。这样我就会丢失使我的 UI 无效的信息,所以我无论如何都需要收听和复制 server/machine/hardware 的状态。