javascript - JS等待订阅结果
问题描述
我试图找出等待订阅结果的最佳方式,我在其中传递回调。例如,假设我有以下内容:
function someMethod() {
let someResult = null;
someSubPub.subscribe(someTopic, someKey, someValue, (someResponse) => {
someResult = //do stuff in the callback with someResponse
});
return someResult;
}
我不太确定 await 在这种情况下如何正确工作,也就是在回调中阻塞。
解决方案
Async/Await 很好,但有时考虑/抽象掉的Promise
构造会更简单。async
await
我建议:
function someMethod() {
return new Promise((resolve, reject) => {
someSubPub.subscribe(someTopic, someKey, someValue, () => {
const someResult = //do stuff in the callback
resolve(someResult);
});
});
}
如果你不想直接使用 Promise,你可以 wrapsomeSubPub.subscribe
返回一个 Promise
function someSubPubSubscribePromise(topic, key, value) {
return new Promise((resolve, reject) => {
someSubPub.subscribe(topic, key, value, resolve);
});
}
async function someMethod() {
await someSubPubSubscribePromise(someTopic, someKey, someValue);
const someResult = //do stuff in the callback
return someResult;
}
在这些示例中的任何一个中,您都可以这样做const result = await someMethod()
(您可以await
使用async
返回承诺的方法和常规方法)
需要考虑的一件事:通常一个 pub/sub 接口可以多次调用回调。异步方法/返回承诺的方法只能解决或拒绝一次。在您响应事件一次后,您可能应该在回调中取消订阅?
推荐阅读
- apache - .htaccess 将文件名 URL 的请求重写为对应的永久链接 URL
- python - 如何解决python kivy中拒绝的android 10存储权限
- javascript - 打印iframe时,iframe中的onafterprint停止在chrome中触发?
- c# - Asp.Net Net 5 强制浏览器从智能卡读取证书
- c++ - 无法构建 OMNeT++ 项目
- python - nbconvert to markdown:避免代码单元格中的缩进
- r - r中的NROW和nrow有什么区别?
- mongodb - 如何在没有光标的情况下使用来自同一元素的值更新/添加新属性到数组元素
- html - 如何使div中的元素居中
- python - 接受 Linux 命令以返回服务器运行状况的 Python 脚本