【问题标题】:Javascript promise wait for AccessToken valueJavascript 承诺等待 AccessToken 值
【发布时间】:2016-11-29 15:25:18
【问题描述】:

我在理解值方面遇到了很大的问题,我得到了使用访问令牌获取数组的函数,我将此令牌传递给 ajax url 以获取 json 数据。我知道我需要在获得访问令牌后使用那里的承诺来运行 ajax。你能帮我做这个吗?

componentDidMount: function () {
    var component = this;
    var accessToken = getAccessToken();
    $.ajax({
        type: 'GET',
        url: window.APIUrl +'services/?access_token=' + accessToken,
        dataType: 'json',
        success: function(response)
        {
            component.setState({
                services : response
            });
        }
    });
}

function getAccessToken(){
var client_id = '****',
    client_key = '****',
    $ = jQuery;
if(!window.accessToken){
    $.ajax({
        url : APIUrl + 'auth',
        method : 'post',
        data : {
            'id' : client_id,
            'key' : client_key
        },
        success: function(response){
            if(typeof response.access_token != 'undefined'){
                /*console.log(response);*/
                window.accessToken = response.access_token;
                return response.access_token;
            }else{
                return false;
            }
        }
    });
}else{
    return window.accessToken;
}

}

【问题讨论】:

  • getAccessToken 的代码在哪里?

标签: javascript jquery ajax reactjs promise


【解决方案1】:

让你的函数getAccessToken返回一个承诺

componentDidMount: function () {
    var component = this;
    getAccessToken()
       .then(function(accessToken) {
          var url = window.APIUrl +'services/?access_token=' + accessToken,
          return $.getJSON(url)
       })
       .then(function(response) {
         component.setState({
            services: response
       });
    });
}

function getAccessToken(){
   if(window.accessToken) {
      return $.when(window.accessToken)
   }

   return $.ajax(...) // get access token from server
}

【讨论】:

    【解决方案2】:

    试试这样的

    componentDidMount: function () {
      var component = this;
      getAccessToken().then(function(accessToken) {
        $.ajax({
            type: 'GET',
            url: window.APIUrl +'services/?access_token=' + accessToken,
            dataType: 'json',
            success: function(response)
            {
                component.setState({ services : response });
            }
        });
      })
    }
    
    function getAccessToken(){
      var deferred = $.Deferred()
    
      var client_id = '****',
          client_key = '****',
          $ = jQuery;
    
      if(!window.accessToken){
        $.ajax({
            url : APIUrl + 'auth',
            method : 'post',
            data : {
                'id' : client_id,
                'key' : client_key
            },
            success: function(response){
                if(typeof response.access_token != 'undefined'){
                  /*console.log(response);*/
                  window.accessToken = response.access_token;
                  deferred.resolve(window.accessToken)
                } else {
                  deferred.reject()
                }
            }
        });
      } else {
        deferred.resolve(window.accessToken)
      }
    
      return deferred.promise()
    }
    

    【讨论】:

    • 这看起来很酷但不幸的是我在控制台中遇到了这种错误:(“未捕获的 TypeError: this.setState is not a function”
    猜你喜欢
    • 2020-10-31
    • 2018-08-27
    • 2019-06-30
    • 1970-01-01
    • 1970-01-01
    • 2013-09-16
    • 2019-04-29
    • 1970-01-01
    • 2018-10-17
    相关资源
    最近更新 更多