0

簡単なシナリオがあります-ヘッダーに値(ある種のトークン)を追加するインターセプターでhttp呼び出しを開始したいと思います。

問題は、トークンがhttp経由でも受信されることです(最初の呼び出しである必要があります)が、他のすべての呼び出しを行って、独自の呼び出しを発行する前に終了するのを待つ方法がわかりません...

.factory('sessionData', function () {
    var currentToken = '[uninitialized-token]';
    return {
        getToken: function () {
            return currentToken;
        },
        setAuthData: function (token) {
            currentToken = token;
        }
    }
})
.factory('sessionInjector', ['sessionData', function (sessionData) {
    var sessionInjector = {
        request: function (config) {
            console.log("sending with token: " + sessionData.getToken());
            config.headers['x-header-sessionID'] = sessionData.getToken();
        }
    };
    return sessionInjector;
}])

.config(['$httpProvider', function ($httpProvider) {
    $httpProvider.interceptors.push('sessionInjector');
}])

.run(['$http', 'configs', 'sessionData', function ($http, configs, sessionData) {
    $http.get(configs.authApiUrl + 'login').then(function (ret) {
        sessionData.setAuthData(ret);
        console.log("successfully authenticated with token " + sessionData.getToken());
    });
}])

.controller('TestCtrl', function($http){
    $scope.p1 = 'Uninitialized';

    $http.get('http://localhost/api/getData').then(function(ret){
        $scope.p1 = ret;
    });
});

問題はTestCtrl、メソッドがトークンの取得を完了する前に http 呼び出しを発行することですrun(その結果、ヘッダー値の値に[uninitialized-token]が含まれます)。

「実行」非同期メソッドが完了するまでコントローラーを待機させるにはどうすればよいですか?

4

1 に答える 1

2

$http インターセプターを使用して、コールバックで promise を返すことができます。これを使用して各呼び出しをインターセプトし、promise が解決されるまで遅延させることができます。

これに対してプロミスがどのように機能するかを理解する必要があります。

例:

myModule.factory('tokenPromise', function($http) {
    return $http.get({url: 'myurl/token', bypassToken: true}).then(function(data) {
         // This is when your token webservice return, deal with the response here
         return data.token;
    });
});

myModule.factory('myHttpInterceptor', function($q, tokenPromise) {
  return {
    'request': function(config) {
      if (config.bypassToken) return config;
         // This ensures the token promise is resolved before proceeding with the request.
      return tokenPromise.then(function(token) {
         config.headers['x-header-sessionID'] = token;
         return config;
      });
    },
  };
});


myModule.config(function($httpProvider) {
     //wire the interceptor here
     $httpProvider.interceptors.push('myHttpInterceptor');
})

参考:angular公式ドキュメントのhttpサービス

于 2015-08-06T15:07:24.130 に答える