繁体   English   中英

将ajax json对象放入javascript变量

[英]Placing an ajax json object into a javascript variable

自从我之前提出问题以来, 一直在试图解决这个问题

我可以使用safari上的Develop > Show Web Inspector来接收数据,就像在资源下看到的那样。 但是我似乎无法成功地将其分配给变量以供以后使用。

<script>
function getData () {
  $.ajax
    ({
      type: "GET",
      url: "https://myjirasite.com/jira/rest/api/2/project/ON/versions?",
      dataType: 'jsonp',
      //async: true,
         beforeSend: function (xhr) {xhr.setRequestHeader('Authorization', make_base_auth("myusername", "mypassword"));},
      success: function (){

      //Attempt 1 at outputting the result to an alert. 
      alert(JSON.parse(data));            
      }
    });

  }


function make_base_auth(user, password) {
  var tok = user + ':' + password;
  var hash = btoa(tok);
  return 'Basic ' + hash;
}

</script>

在第二次尝试中,我将ajax调用分配给变量,然后尝试将其打印出警报。 没有成功 警报为空

  var jqXHR = $.ajax
    ({
      type: "GET",
      url: "https://myjirasite/jira/rest/api/2/project/ON/versions?",
      dataType: 'jsonp',
      async: false,
         beforeSend: function (xhr) {xhr.setRequestHeader('Authorization', make_base_auth("myusername", "mypassword"));},
      success: function (data){
        alert(JSON.parse(data));            
      }
    });

    alert(JSON.parse(jqXHR.responseText));

我知道问题在于ajax调用是异步的,但我不知道如何编写回调,这样我就可以将json数据放入变量中,以供以后通过其他函数使用。

不要设置async: false ,因为这将在处理您的Ajax请求时阻止浏览器。

相反,您可以使用promise,或从成功回调中调用其他函数。

就像是:

function getData(){
  return $.ajax({
    type: "GET",
    url: "https://myjirasite/jira/rest/api/2/project/ON/versions?",
    dataType: 'jsonp',
    beforeSend: function(xhr){
      xhr.setRequestHeader('Authorization', make_base_auth("myusername", "mypassword"));
    }
  });
}

getData()
.done(function (data){
  console.log(JSON.parse(data));            
})
.fail(function(){
  console.log("Error!");
});
<script>

var getData = function() {

  $.ajax
    ({
      type: "GET",
      url: "https://myjirasite.com/jira/rest/api/2/project/ON/versions?",
      dataType: 'jsonp',
      //async: true,
         beforeSend: function (xhr) {xhr.setRequestHeader('Authorization', make_base_auth("myusername", "mypassword"));},
      success: function (){

      //Attempt 1 at outputting the result to an alert. 
      alert(JSON.parse(data));            
      getData.data= JSON.parse(data);
      }
    });

  }


function make_base_auth(user, password) {
  var tok = user + ':' + password;
  var hash = btoa(tok);
  return 'Basic ' + hash;
}

setTimeout(function(){console.log(getData.data);}, 3000); // Fire after 3 seconds to get data.

</script>

我认为$.ajax实际上不会返回任何内容-但我可能错了。 无论哪种方式,都不太重要,因为您不应该依赖立即可用的ajax调用的结果。 您的alert语句在Ajax请求完成之前就触发了-听起来您已经知道了。

当利用异步调用(ajax)时,最佳实践是使任何逻辑都依赖于从调用返回的数据以在回调中完成(或由回调触发)(或@Jack Zelig提到的Promise)。 这就是$.ajax success参数的全部含义。 一旦请求成功完成,它将被调用。 您还可以定义completeerror回调-分别在请求完成(无论状态如何)和请求失败后触发。

综上所述,您最好的选择可能是:

var jqXHR = $.ajax
({
  type: "GET",
  url: "https://myjirasite/jira/rest/api/2/project/ON/versions?",
  dataType: 'jsonp',
  success: successHandler
});

function successHandler(data) {
    alert(JSON.parse(data));
}

这样,仅一旦接收到数据,便会显示包含该数据的警报。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM