如何多次解决承诺?

时间:2017-09-26 01:23:00

标签: javascript events ecmascript-6 promise

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

想想以下示例:

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方法来实现这一目标。

2 个答案:

答案 0 :(得分:7)

  

如何多次解决承诺?

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

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

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

您可以返回一个类似承诺的界面(不遵循Promise标准),它会多次调用其通知回调。为避免与promises混淆,我不会使用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)})作为方法名称:

Console~/

Console
R Markdown

    .../R Test 1/Fall Programming with R Test 1.Rmd     
Error in loadNamespace(i, c(lib.loc, .libPaths()), versionCheck = vI[[i]]) : 
  there is no package called 'backports'
Calls: :: ... tryCatch -> tryCatchList -> tryCatchOne -> <Anonymous>
Execution halted

答案 1 :(得分:0)

我在Typescript中有解决方案。

ani.event_source.start()
相关问题