Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/418.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在服务中使用异步库?_Javascript_Angularjs_Asynchronous_Angular Services - Fatal编程技术网

Javascript 如何在服务中使用异步库?

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

我正在尝试在我的服务中使用异步库。最后,我计划执行一系列$resource.query调用,并将结果向下传递

我遇到的问题是让console.log等待异步系列完成。如何设置async_service.async_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函数。那可能会满足你的要求。