增加对承诺的支持的最佳方法

时间:2019-07-01 21:49:38

标签: javascript

我想转换一个不使用标准node.js回调样式的现有包来支持现有的回调样式或promises。考虑类似的东西:

api.getSomething({prop: ...}, callback)

它当前使用request库,而api.getSomething则是这样的:

return request({
  url: ...,
  data: ...,
}, callback)

在我看来,这种高级解决方案基本上是检查callback是否未定义,如果是,则返回诺言。但是,request库的使用似乎使这一点变得复杂,因为我想要一个request库,该库在未定义回调时返回promise,否则返回请求。

使用request-promise库是否有意义,如果提供了回调,请在then中调用回调,否则只需返回then中的数据?

2 个答案:

答案 0 :(得分:1)

是的,您可以这样做。确保仅总是返回一个Promise,并且如果提供了回调,则也要调用它。

const promise = request({
  url: …,
  data: …,
});
if (typeof callback == "function") {
    promise.then(result => { callback(null, result); }, error => { callback(error); });
}
return promise;

如果您多次执行此操作,建议您使用辅助功能。

答案 1 :(得分:0)

嗯,两种方法都可以起作用:

1)回调承诺:

  getSomething(prop, callback) {
    if(!callback) return new Promise((res, rej) => this.getSomething(prop, (err, result) => err ? rej(err) : res(result)));
    //...
    callback(null, "result");
  }

2)承诺回调:

  getSomething(prop, callback) {
     const promise = Promise.resolve(/*...*/);
     if(callback) {
      promise.then(res => callback(null, res), callback);
     } else {
      return promise;
     }
  }

您所使用的哪个取决于您。但是,您应该考虑更新依赖项会导致比您预期的麻烦更多(但是request-promise应该得到很好的维护)。