我对ajax和Javascript相当新 我有这个代码
duration_reco = $.ajax({
url : newurl,
dataType : 'json'
}).done(function (obj) {});
console.log(duration_reco);
我得到的输出是http://grab.by/v0lc 我对responseJSON(快照中的最后一个对象)感兴趣。我已经尝试过duration_reco.responsejSON,但它不起作用。我怎样才能得到线索。
只需提供更多代码,以便您可以提供更好的帮助
for(var i=1;i<=10;i++)
{
duration_reco = $.ajax({
url : newurl,
dataType : 'json'
}).done(function (obj) {
console.log(obj.data.duration);
//console.log(duration_reco.responseJSON());
data[i - 1] = {
"duration" : obj.data.duration
};
});
}
我试图做这样的事情,但似乎既没有'我'也没有'数据'可以在里面访问。我的其他选择是什么?
答案 0 :(得分:1)
您的Ajax请求是异步完成的,而您的代码是以线性方式执行的。您需要在回调函数中记录输出。
var duration_reco = {};
$.ajax({
url : newurl,
dataType : 'json'
}).done(function (obj) {
duration_reco = obj;
console.log(duration_reco);
});
答案 1 :(得分:0)
您可以在.done
函数中访问obj
作为参数。
}).done(function (obj) {
//console.log(obj); //your response
});
答案 2 :(得分:0)
在这个问题的评论中,您已经说过“我想让它同步”和“我可以在外面访问它”之类的内容。您遇到了学习者在使用异步代码时会遇到的一个非常常见的问题。你很生气,因为你想写这样的代码:
您觉得异步请求只会妨碍您。不要这样!不要感到沮丧:了解问题然后变得平坦。这是一个可以帮助您tame asynchronous code的优秀资源的链接。
编辑:使用您提供的示例代码,我精心设计了一个如何使用promises设置这一切的最小示例。查看working fiddle。
// global variables: find a better way!
var data = [];
var count = 0;
// a function that returns a promise can be "waited for"
var many_requests = function () {
var promise = $.Deferred();
for(var i = 0; i < 10; i++) {
make_one_request(i, promise);
}
return promise; // "I promise one day I'll be an array of responses"
};
var make_one_request = function (index, promise) {
$.ajax({
url : '/echo/json/',
dataType : 'json',
method: 'post', // <---- I'm making a POST because this is a fiddle
// you will still use a GET
data: {}, // <-- your data here
success: function (response) {
// these will run out of order, but your array will be ordered
data[index] = response;
console.log(index);
// if the time has come, resolve the promise
count++;
if (count == 10) {
promise.resolve(data); // OK! I'm an array of responses now!
}
}
});
};
// I will wait until I have an array of response data
$.when(many_requests()).then( function (data) {
// woo!
console.log(data);
});
特别要注意成功函数中的console.log
语句。结果无序返回,但您的数组仍按正确顺序编制索引。 then
函数的回调只有在many_requests
返回的承诺得到解决后才会运行。
也许这对你有用,也许不会,但真正重要的是:当你遇到一种新的编程,一种新模式,或一种新技术......不要试图逃跑躲在你原来的范例里!拥抱新的和有趣的东西,尽可能多地学习,然后选择你最喜欢的技术并将它们放在工具带中。