Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/465.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 - Fatal编程技术网

Javascript 如何使用异步调用更改工厂的变量?

Javascript 如何使用异步调用更改工厂的变量?,javascript,angularjs,Javascript,Angularjs,我对Angularjs有点陌生,我正试图找到实现这种流动的最佳结构: 从我的服务器异步获取访问令牌 将其存储在提供程序中,作为将来使用的变量 使用access\u令牌对第三方服务器进行异步调用 我的工厂现在看起来像这样 app.factory('SomeFactory',['$resource', function($resource){ //access_token only needs to be set once var access_token = 0; var

我对Angularjs有点陌生,我正试图找到实现这种流动的最佳结构:

  • 从我的服务器异步获取访问令牌
  • 将其存储在提供程序中,作为将来使用的变量
  • 使用access\u令牌对第三方服务器进行异步调用
  • 我的工厂现在看起来像这样

    app.factory('SomeFactory',['$resource', function($resource){
        //access_token only needs to be set once
        var access_token = 0; 
        var request = $resource('/my/server/').get();
        request.promise.then(function(result){
                access_token = result;
            }
    
        );
        return $resource('https://third.party/:token',{token: access_token});
    }])
    
    我无法设置访问令牌,回调函数将被破坏

    另外,如何形成一个链,以便在首先设置访问令牌之前无法调用第三方?

    试试这个

    app.factory('SomeFactory',['$resource, $q', function($resource, $q){
        var service = {};
    
        //access_token only needs to be set once
        var access_token = null; 
    
        getAccessToken = function() {
            var deferred = $q.defer();
    
            if (access_token) {
                deferred.resolve(access_token);
            } else {
                $resource('/my/server/').then(function(result){
                    access_token = result;
                    deferred.resolve(access_token);
                });    
            }
    
            return deferred.promise;    
        }
    
        service.callThirdParty = function() {
    
            var deferred = $q.defer();
    
            getAccessToken.then(function(access_token) {
                $resource('https://third.party/:token',{token: access_token}).then(function(result) {
                    deferred.resolve(result);
                })
            })
    
            return deferred.promise;
        }
    
    
        return service;
    }]);
    

    有必要把它作为一个工厂吗?我的意思是有必要从工厂返回$resource吗?不一定,因为我是来自后端开发人员的angularjs新手,我只是想避免使用样板代码。有没有更好的设计模式更适合我的目的?谢谢你的回复。我在第二个
    deferred=$q.deferred()
    处得到一个错误,我猜它被推迟到了早期?错误消息类似于
    $q没有函数defer