Javascript 添加对承诺的支持的最佳方法
我想转换不使用标准node.js回调样式的现有包,以支持现有回调样式或承诺。考虑一下:Javascript 添加对承诺的支持的最佳方法,javascript,Javascript,我想转换不使用标准node.js回调样式的现有包,以支持现有回调样式或承诺。考虑一下: api.getSomething({prop: ...}, callback) 它当前使用request库和api。getSomething执行如下操作: return request({ url: ..., data: ..., }, callback) 在我看来,这种高级解决方案基本上是检查回调是否未定义,如果未定义,则返回一个承诺。然而,请求库的使用似乎使这一点复杂化,因为我想要一个请求库,
api.getSomething({prop: ...}, callback)
它当前使用request
库和api。getSomething
执行如下操作:
return request({
url: ...,
data: ...,
}, callback)
在我看来,这种高级解决方案基本上是检查回调
是否未定义,如果未定义,则返回一个承诺。然而,请求
库的使用似乎使这一点复杂化,因为我想要一个请求
库,它在没有定义回调时返回一个承诺,而请求则不然
使用
请求承诺
库是否有意义?如果提供了回调,则在然后
中调用回调,否则只返回然后
中的数据?是的,您可以这样做。确保总是简单地返回一个承诺,如果提供了回调,也可以调用它
const promise = request({
url: …,
data: …,
});
if (typeof callback == "function") {
promise.then(result => { callback(null, result); }, error => { callback(error); });
}
return promise;
如果您不止一次这样做,我建议您使用一个helper函数。好吧,两种方法都可以:
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;
}
}
你用哪一个真的取决于你。然而,你应该考虑更新一个依赖项会导致比你预期的更多的麻烦(但是<代码>请求承诺< /代码>应该被很好地保持)。