将可多次调用的Javascript回调转换为promise

Convert Javascript callback which can be called multiple times into promise

有没有办法将可以多次调用的带回调的 Javascript 调用转换为 Promise?

说,

scan(function(result) {
  // this is actually a Bluetooth device scan (Cordova), and 
  // will return something when a device is found.
  // So this can be called more than once.
});

并将其包装成承诺?

function scanP {
  return new Promise(function(resolve, reject) {
    scan(function (result) {
     resolve(result); // attempt to call repeatedly, but doesn't work.
    });
  });
}

scanP(function(result) {
   // check if this device is what we want.
})
.catch(function(err) {
  // handle error
});

我也需要这个模式来订阅来自蓝牙设备的数据。 promise 不适合这个任务吗?

编辑:我正在使用 Bluebird。

Promise 只解决一次。如果想多次解决它,那么你想要的不是承诺。

您可能需要自定义事件(在浏览器中),Node 的 EventEmitterStream(继承 EventEmitter,具有 .pipe,可选缓冲)。如果您想要的只是一个回调链解决方案,那么编写您自己的解决方案似乎并不难。