为AngularJS $ q提供promisify(denodeify)的模块

时间:2014-04-24 14:03:01

标签: angularjs promise

我想使用browserify在我的Node.js服务器和我的AngularJS客户端之间共享代码。我想保持基于Node.js的API回调,但在AngularJS代码中使用$ q promises。

示例:

// This is the function I am going to share
// It lives in the file 'foo.js'
function foo(cb) {
  // do some async work
  cb(null, result);
}
module.exports = foo;


// In the AngularJS setup, I want to register
// a promisified version of this function
// as an Angular service
app.service('foo', $q.promisify(require('foo.js')));


// My controllers see the usual AngularJS API
app.controller('FooCtrl', ['foo', function(foo) {
  foo().then(function(result) {
    $scope.data = result;
  });
}]);
像Q或Bluebird这样的“完整”承诺库提供了将基于回调的函数转换为承诺返回函数的工具 - Q有denodeify,Bluebird有promisifypromisifyAll

是否有任何提供$q.promisify或类似的AngularJS模块?

注意

我知道自己写promisify并不困难,天真的版本只有大约16行代码。优化版本可以基于Bluebird在promisify.js中的实现。

我提出这个问题的原因是为了避免重新发明轮子,这样我就可以把时间花在增加更多价值的事情上。

1 个答案:

答案 0 :(得分:1)

您可以使用bluebirdrsvp thunks promisify方法( thunk 是其中的任何回调"节点" function(err, arg1, arg2, ...)的样式。

但是,您需要有一个包装,在履行承诺时也会调用$scope.$apply()