如何多次兑现承诺?

奥兰斯特

听起来可能很奇怪,但是我正在寻找一种可以多次解决承诺的方法。有什么方法可以做到这一点?

考虑以下示例:

getPromise() {
  const event = new Event('myEvent');

  setTimeout(() => {
    window.dispatchEvent(event);
  }, 5000);

  setTimeout(() => {
    window.dispatchEvent(event);
  }, 7000);

  return new Promise((resolve) => {
    window.addEventListener('myEvent', () => {
      resolve('some value'));
    });

    resolve('some value'));
  });
};

然后.then():

getPromise().then(data => {console.log(data)})

应给出以下结果:

some value // initial
some value // after 5000ms
some value // after 7000ms

因此,我知道有一些库可以流数据,但是我确实在寻找一种本机的非Callbak方法来实现这一目标。

jfriend00

如何多次兑现承诺?

你不能 承诺只能解决一次。一旦解决,他们再也不会改变状态。它们本质上是单向状态机,具有三个挂起,实现和拒绝的可能状态。一旦它们从待定变为已实现,或者从待定变为拒绝,就无法更改。

因此,您几乎不能也不应将诺言用于您想多次发生的事情。事件监听器或观察者比类似的承诺要好得多。您的承诺只会通知您有关它收到的第一个事件的信息。

我不知道您为什么要在这种情况下避免回调。承诺也在其.then()处理程序中使用回调您将需要在某处进行回调以使解决方案正常工作。您能解释一下为什么不直接使用window.addEventListener('myEvent', someCallback)它的原因吗?


您可以返回类似promise的接口(不遵循Promise标准),该接口会多次调用其通知回调。为了避免与promise混淆,我不会将其.then()用作方法名称:

function getNotifier() {
  const event = new Event('myEvent');

  setTimeout(() => {
    window.dispatchEvent(event);
  }, 500);

  setTimeout(() => {
    window.dispatchEvent(event);
  }, 700);

  let callbackList = [];
  const notifier = {
      notify: function(fn) {
          callbackList.push(fn);
      }
  };
  window.addEventListener('myEvent', (data) => {
      // call all registered callbacks
      for (let cb of callbackList) {
          cb(data);
      }
  });
  return notifier;
};

// Usage:
getNotifier().notify(data => {console.log(data.type)})

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章