Javascript 如何在服务中使用异步库?
我正在尝试在我的服务中使用异步库。最后,我计划执行一系列$resource.query调用,并将结果向下传递 我遇到的问题是让console.log等待异步系列完成。如何设置async_service.async_func调用使其异步,以便在运行之前等待所有控制器函数完成Javascript 如何在服务中使用异步库?,javascript,angularjs,asynchronous,angular-services,Javascript,Angularjs,Asynchronous,Angular Services,我正在尝试在我的服务中使用异步库。最后,我计划执行一系列$resource.query调用,并将结果向下传递 我遇到的问题是让console.log等待异步系列完成。如何设置async_service.async_func调用使其异步,以便在运行之前等待所有控制器函数完成 angular.module('app.services').factory('async_service', ['$resource', function($resource) { async_func:func
angular.module('app.services').factory('async_service', ['$resource',
function($resource) {
async_func:function(){
return async.series([
function(callback){
//will do a $resource.query() call eventually
callback(null, 'one');
},
function(callback){
//will do a $resource.query() call eventually
callback(null, 'two');
}
],
// optional callback
return function(err, results){
return results;
});
}
}]);
angular.module('app.controllers', []) .controller('AppCtrl', ['$scope','async_service', function($scope, async_service) {
var v = async_service.async_func();
console.log(v); //should be ['one', 'two'] but getting undefined
}]);
您的console.log打印输出需要等待async.series中的所有调用完成。更改函数调用以获取回调,并在完成后打印返回值:
async_func:function(cb) {
return async.series([
function(callback){
//will do a $resource.query() call eventually
callback(null, 'one');
},
function(callback){
//will do a $resource.query() call eventually
callback(null, 'two');
}
],
// optional callback
function(err, results){
return cb(err, results);
});
}
}]);
async_service.async_func(function(err, results) {
if (!err)
console.log(results);
})
更好的方法是使用$q it is angular的承诺系统。如果您使用另一个第三方依赖项,则不需要额外的膨胀 您的服务只是:
angular.module('app.services').factory('async_service', ['$resource', '$q',
function($resource, $q) {
return {
async_func: function() {
return $q.all(['one','two', this.hitApi()]);
},
hitApi: function () {
/*
Simulate api call,
$timeout returns a promise which is resolved when the timeout is met.
Same as $http
*/
return $timeout(function(){ return 'three'}, 1000);
}
}
}
]);
并将其用作
async_service.async_func().then(function (v) {
/*
.then() here will be called once all values/promises passed to $q.all have been resolved.
If it receieves a promise it will wait untill those promises have been resolved.
This would make it even easier if yo wish to do network calls as they return promises.
*/
console.log(v); //Will be ['one', 'two']
});
有一点需要注意$q、 所有功能都不会执行。它只是把价值包装在承诺中。如果该值碰巧已经是一个承诺,它将等待它解决,然后再自行解决。这就是为什么我添加了hitApi方法,以便您可以看到如何实现该行为。还要注意控制器中的.then如何在触发前等待超时完成
参见小提琴:
见文件:$q
编辑:而且您的初始服务无论如何都不会运行,因为它会抛出语法错误
这可能是您的错误位减去服务中缺少的返回{}部分,但我猜这是将代码复制到SO中的错误:
// optional callback
return function(err, results){
return results;
});
JavaScript不是这样工作的。不能在该上下文中使用return关键字。将变量传递给方法async.series,第一个是数组,第二个是在每个数组函数中调用完回调后要完成的回调
async.series不返回值。我不能,因为它对数组方法的执行是异步的。我根本不理解您的代码。。。但对于您的问题,一个非常好的解决方案是在Angular中使用$q服务,并开始使用承诺。阅读$q和$q.all函数。那可能会满足你的要求。