簡體   English   中英

為什么在答應后我的價值沒有得到確定

[英]Why is my value coming back undefined after a promise

         var result = {},
            data={},
            access_token = result.access_token,
            baseURI = result.resource_server_base_uri;

        function getToken() {
            var query_string = {};
            var query = window.location.search.substring(1);
            var vars = query.split("&");
            for (var i=0; i < vars.length; i++) {
                var pair = vars[i].split("=");
                query_string[pair[0]] = pair[1];
            }
            if (typeof(query_string.access_token) != "undefined") {
                result.state = query_string.state;
                result.scope = decodeURIComponent(query_string.scope);
                result.access_token = decodeURIComponent(query_string.access_token);
                result.expires_in = query_string.expires_in;
                result.resource_server_base_uri = decodeURIComponent(query_string.resource_server_base_uri);
                result.token_type = query_string.token_type;
            }
        }

        function startSession(startSessionPayload){
                access_token = result.access_token;
                baseURI = result.resource_server_base_uri;

            return $http({
                'url': baseURI + 'services/v6.0/agent-sessions',
                'method': 'POST',
                'headers': {'Authorization': 'bearer ' + access_token, 'content-Type': 'application/json'},
                'data': startSessionPayload
            }).then(function(res){
                 data.sessionId = res.data.sessionId;
                console.log("sessionId", data.sessionId); <---shows session Id I need to use later
            });
        }

        console.log('SESSIONID', data.sessionId); <--- returns undefined

這段代碼似乎成功地從res中獲取了我需要的sessionId,但是當我嘗試將其應用於啟動的數據變量對象時(類似於我對var result = {}所做的操作,並在其他函數中使用它,則返回undefined我搞砸了什么?

這是一個異步調用,當您訪問data對象上的該屬性時,它是空缺的,因為尚未設置。 你必須做類似的事情

function startSession(startSessionPayload){
            access_token = result.access_token;
            baseURI = result.resource_server_base_uri;

        return $http({
            'url': baseURI + 'services/v6.0/agent-sessions',
            'method': 'POST',
            'headers': {'Authorization': 'bearer ' + access_token, 'content-Type': 'application/json'},
            'data': startSessionPayload
        }).then(function(res){

             return res.data.sessionId;

        });
    }

然后稱它為

startSession(payload).then(function(id){
   data.id = id;
  // do your logic here
});

在外部上下文中看不到SessionId的原因是這是一個立即執行的同步代碼。 該函數中的console.log是異步的,這意味着它會在http請求的結果出現時執行。

因此(假設您實際上在運行該函數)您將無法看到它的原因是,尚未執行異步.then()

解決方案:返回諾言:

function startSession(startSessionPayload){
                access_token = result.access_token;
                baseURI = result.resource_server_base_uri;

            return $http({
                'url': baseURI + 'services/v6.0/agent-sessions',
                'method': 'POST',
                'headers': {'Authorization': 'bearer ' + access_token, 'content-Type': 'application/json'},
                'data': startSessionPayload
            })
        }

現在在其他部分(您實際需要該值的地方)中,您只需使用then()即可獲取該值。

這里的問題是執行的順序。

然后傳遞給函數的代碼是最后執行的代碼。之后,您需要調用所有需要sessionId的其他函數。 像這樣:

.then(function(res){
    data.sessionId = res.data.sessionId;
    console.log("sessionId", data.sessionId); <---shows session Id I need to use later
    anyOtherFunction(data.sessionId);
});

function anyOtherFunction(sessionId) {
    console.log('SESSIONID', sessionId); <--- not undefined
}

正如其他答案所寫,這是一個異步值。 我認為,最好的解決方案是在路由到需要會話ID的頁面之前使用resolve。 即:

angular.module('app').config(function($routeProvider) {
  $routeProvider.when('need-session', {
    templateUrl: 'your-page-template',
    controller:  'your-page-controller',
    resolve: {
      sessionId: function($http) {
        return $http({
            'url': baseURI + 'services/v6.0/agent-sessions',
            'method': 'POST',
            'headers': {'Authorization': 'bearer ' + access_token, 'content-Type': 'application/json'},
            'data': startSessionPayload
        }).then(function(res){
             return res.data.sessionId;
        });
      }
    });
  });

然后通過控制器檢索它:

angular.module('app').controller('your-page-controller', function($scope, sessionId) {
  //Use the sessionId as needed
});

希望對您有所幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM