将ajax json对象放入javascript变量

将ajax json对象放入javascript变量,javascript,ajax,json,asynchronous,Javascript,Ajax,Json,Asynchronous,从那以后我一直在想这个问题 我可以通过在safari上使用Develop>ShowWebInspector接收数据,正如我在参考资料中看到的那样。但我似乎无法成功地将其分配给一个变量以供以后使用 <script> function getData () { $.ajax ({ type: "GET", url: "https://myjirasite.com/jira/rest/api/2/project/ON/versions?",

从那以后我一直在想这个问题

我可以通过在safari上使用Develop>ShowWebInspector接收数据,正如我在参考资料中看到的那样。但我似乎无法成功地将其分配给一个变量以供以后使用

<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调用是异步的,但我不知道如何编写回调,以便能够将json数据获取到一个变量中,以便稍后通过另一个函数使用

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

相反,您可以使用承诺,或者从成功回调中调用另一个函数

比如:

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!");
});
我认为$.ajax实际上不会返回任何东西,但我可能错了。不管怎样,这都不太重要,因为您不应该依赖ajax调用的结果立即可用。您的警报语句在Ajax请求完成之前触发——听起来您已经知道了

在利用异步调用ajax时,最好的做法是让依赖于调用返回的数据的逻辑在回调中完成或由回调触发,或者像@Jack Zelig提到的那样。这就是$.ajax的成功参数的全部内容。一旦请求成功完成,它将被调用。您还可以定义complete回调和error回调—在请求完成后,无论状态如何,以及在请求失败后分别触发

总之,您最好的选择可能是:

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

这样,只有在收到数据后,才会显示包含数据的警报。

您应该保存变量数据。它是服务器返回值的位置。你在服务器端清除了cal的错误了吗?你确定它会到达那里吗?@NelsonTeixeira,很遗憾,我无法在服务器端调试。为我的公司制作…你确定你的url是正确的吗?请在本地服务器返回任何内容时尝试此代码。如果它起作用,你就会知道它是错误的url是的,绝对是正确的url。我已经在一个curl脚本上成功地使用了它,并且我可以看到返回了数据,正如我在第一段中提到的。这似乎有效,但是警报仍然显示未定义。事实上,我替换了console.logTry的警报,在successHandler中设置了一个断点,然后查看在JSON.parse之前返回的数据是什么,或者只返回console.logdata。如果数据未定义,则可能是服务器端有错误或url错误。console.logdata只返回undefinedRight…因此您的请求成功完成,因为服务器返回了肯定的响应,但数据不是您所期望的。再次验证您是否连接到了正确的URL,如果这不是问题,那么这是一个错误服务器端。在顶部的原始解决方案中,我可以看到我获得了数据,我只是尝试将其分配给一个变量。这是不可能的,因为调用是异步的。这是关于在服务器返回数据后将数据分配给变量。这与上面返回未定义的数据相同。如果json返回中有多个对象,这是否可能发生?
<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>
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));
}