我想使用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有promisify
和promisifyAll
。
是否有任何提供$q.promisify
或类似的AngularJS模块?
注意
我知道自己写promisify
并不困难,天真的版本只有大约16行代码。优化版本可以基于Bluebird在promisify.js中的实现。
我提出这个问题的原因是为了避免重新发明轮子,这样我就可以把时间花在增加更多价值的事情上。
答案 0 :(得分:1)
您可以使用bluebird
或rsvp
thunks 的promisify
方法( thunk 是其中的任何回调"节点" function(err, arg1, arg2, ...)
的样式。
但是,您需要有一个包装,在履行承诺时也会调用$scope.$apply()
。