首页 > 解决方案 > JS等待订阅结果

问题描述

我试图找出等待订阅结果的最佳方式,我在其中传递回调。例如,假设我有以下内容:

function someMethod() {
  let someResult = null;
  someSubPub.subscribe(someTopic, someKey, someValue, (someResponse) => {
     someResult = //do stuff in the callback with someResponse
  });
  return someResult;
}

我不太确定 await 在这种情况下如何正确工作,也就是在回调中阻塞。

标签: javascript

解决方案


Async/Await 很好,但有时考虑/抽象掉的Promise构造会更简单。asyncawait

我建议:

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 接口可以多次调用回调。异步方法/返回承诺的方法只能解决或拒绝一次。在您响应事件一次后,您可能应该在回调中取消订阅?


推荐阅读