如何多次解决承诺?

Orl*_*ter 1 javascript events promise ecmascript-6

这可能听起来很奇怪,但我正在寻找一种方法来多次解决一个承诺.有没有办法让这成为可能?

想想以下示例:

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'));
  });
};
Run Code Online (Sandbox Code Playgroud)

然后.then():

getPromise().then(data => {console.log(data)})
Run Code Online (Sandbox Code Playgroud)

应该给出以下结果:

some value // initial
some value // after 5000ms
some value // after 7000ms
Run Code Online (Sandbox Code Playgroud)

所以我知道有流库存数据库,但我真的在寻找一种原生的非callbak方法来实现这一目标.

jfr*_*d00 7

如何多次解决承诺?

你不能.承诺只能解决一次.一旦他们得到解决,他们再也不会改变他们的状态了.它们本质上是单向状态机,具有待处理,已满足和拒绝的三种可能状态.一旦他们从待决到履行或从待决到被拒绝,他们就无法改变.

所以,你几乎不能也不应该为你想要多次发生的事情使用promises.事件监听器或观察者比这样的事情的承诺要好得多.您的承诺只会通知您收到的第一个事件.

我不知道你为什么要在这种情况下避免回调.Promise在.then()处理程序中也使用回调.您需要在某处进行回调才能使解决方案正常运行.你能解释为什么你不直接使用window.addEventListener('myEvent', someCallback),因为那会做你想要的吗?


您可以返回一个类似承诺的接口(不遵循Promise标准),它会多次调用其通知回调.为避免与promises混淆,我不会将其.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)})
Run Code Online (Sandbox Code Playgroud)