我正在创建一个便利函数,我希望以.then函数的形式返回函数promise的承诺。目前我有:
function foo(a, b){
b = b || 'default';
asyncBar(a + " " + b, function(err, value){
if(err)
console.log("oh shit");
else
return value;
}
};
我可以为foo添加一个回调参数,但不仅是那个笨重但它会从便利函数中删除“方便”。我更愿意只是foo.then(function(){...})
,但我不确定如何从asyncBar()
传递承诺。
更新:我在Node.js中执行此操作,并且返回调用来自随机JSON-RPC库。如果需要,我更愿意使用ES6-Promises ....
答案 0 :(得分:2)
假设你正在使用Bluebird,因为它们是你能做到的最快的:
var bar = Promise.promisify(asyncBar);
function foo(a, b){
return bar(a + " " + b || 'default');
}
在这里,我们宣传该功能,然后将其返回。然后,您可以执行foo.then...
- 错误处理可以在.then
子句的第二个参数或.catch
子句中完成。
如果你正在使用另一个(lamer)承诺库,它不像Bluebird(或者例如Q)提供开箱即用的这个功能 - 你可以这样做:
//assuming broken jQuery "promises"
function foo(a, b){
var d = $.Deferred();
asyncBar(a + " " + b, function(err, value){
if(err){
d.reject();
console.log("oh shit");
} else {
d.resolve(value);
}
});
return d.promise();
};
如果我们谈论ES6(JavaScript.next)承诺,语法将是:
function foo(a, b){
return new Promise(function(resolve,reject){
asyncBar(a + " " + b, function(err, value){
if(err){
console.log("oh shit");
reject();
} else {
resolve(value);
}
});
};