将ajax json对象放入javascript变量中

时间:2014-12-22 20:58:46

标签: javascript ajax json asynchronous

my earlier question以来,我一直试图解决这个问题。

我可以在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数据转换为变量,以便稍后通过不同的函数使用。

3 个答案:

答案 0 :(得分:0)

请勿设置async: false,因为这会在处理Ajax请求时阻止浏览器。

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

类似的东西:

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!");
});

答案 1 :(得分:0)

<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>

答案 2 :(得分:0)

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

当利用异步调用(ajax)时,最好的做法是让依赖于调用返回的数据的任何逻辑在回调中完成(或由其触发)(或者@Jack Zelig提到,承诺)。这是success的{​​{1}}参数的全部内容。一旦请求成功完成,它将被调用。您还可以定义$.ajaxcomplete回调 - 一旦请求完成(无论状态如何),并且一旦请求失败,就会触发。

总而言之,你最好的选择可能就是:

error

通过这种方式,只有收到数据才会显示包含数据的警报。