承诺替换多次调用的回调

Promises to replace a callback gettin invoked multiple times

我有一个方法可以做一些事情并调用回调,并且在一定时间后它会做同样的事情。

var myFunction = function(callback){
  setInterval(function(){
    var stuff; 
    //do some stuff
    callback(stuff)
  }, 3000);
}

我可以将其更改为 promise 函数吗?如果是,用户将如何调用该功能?我打算使用 bluebird 库。

承诺是一次性设备。他们只解决一次,之后他们的状态就不能改变。因此,对于重复发生的事件,它们不是很好甚至是可行的替代品。

要对多次发生的事情使用承诺,您必须有某种接口,允许您每次创建一个新的承诺,并且调用者每次都能以某种方式访问​​这个新的承诺时间。这似乎根本不适合您的特定界面。

像您正在使用的普通回调是重复事件最合乎逻辑的接口。

OP 在评论中询问有关使用承诺来处理从间隔触发的函数内进行的异步调用的结果。看起来像这样:

var myFunction = function(callback){
  setInterval(function(){
    var promise = new Promise(function(resolve,reject) {
      var stuff;
      // Do some potentially-long-running work that modifies 'stuff'
      if (stuffWorked)
        resolve(stuff);
      else
        reject(stuff);
    });
    promise.then(function(returnVal) {
      callback(returnVal);
    });
  }, 3000);
}

这是在使用ECMAscript 6 form of promises。存在许多其他实现...jQuery、q 等。如果需要,我可以添加其他风格的示例。