公开包装函数的承诺

时间:2014-01-30 22:45:02

标签: javascript promise

我正在创建一个便利函数,我希望以.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 ....

1 个答案:

答案 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);
        } 
   });
};