自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数据转换为变量,以便稍后通过不同的函数使用。
答案 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}}参数的全部内容。一旦请求成功完成,它将被调用。您还可以定义$.ajax
和complete
回调 - 一旦请求完成(无论状态如何),并且一旦请求失败,就会触发。
总而言之,你最好的选择可能就是:
error
通过这种方式,只有收到数据才会显示包含数据的警报。