Javascript ajax调用中的数组
我有以下代码从IMDB获取数据:Javascript ajax调用中的数组,javascript,jquery,ajax,arrays,Javascript,Jquery,Ajax,Arrays,我有以下代码从IMDB获取数据: for(var i in titles) { $.ajax({ url: "http://www.imdbapi.com/?t=" + titles[i], dataType: 'jsonp', success: function(data) { $('body').append('"'+titles[i]+'",'); $.each(data, function(key, val)
for(var i in titles)
{
$.ajax({
url: "http://www.imdbapi.com/?t=" + titles[i],
dataType: 'jsonp',
success: function(data) {
$('body').append('"'+titles[i]+'",');
$.each(data, function(key, val) {
$('body').append('"'+val+'",');
});
$('body').append('<br>');
window.setTimeout(null, 1000);
}
});
}
for(标题中的变量i)
{
$.ajax({
url:“http://www.imdbapi.com/?t=“+标题[i],
数据类型:“jsonp”,
成功:功能(数据){
$('body')。追加(''''+标题[i]+'',');
$。每个(数据、函数(键、值){
$('body')。追加('“+val+'”,');
});
$('body')。追加('br>');
setTimeout(null,1000);
}
});
}
除了
$('body')之外,代码工作正常
始终返回相同的标题。函数的success
是异步的(需要等待imdb响应),因此它将始终在整个循环完成后运行,因此该函数中的i
将始终是最后一个i
解决这一问题的最简单方法是使用jQuery的每个功能:
$.each(titles, function (i, value) {
$.ajax({
success: function (data) {
// as usual...
}
});
});
这是因为函数保留了自己的作用域(因此保留了自己的i
)。在调用任何成功处理程序之前,循环将完全执行,因此,当您进入成功处理程序时,“i”将是最后一个标题
你需要像这样的东西
function makeSuccessHandler(titles, i) {
return function (data) {
$('body').append('"'+titles[i]+'",');
$.each(data, function(key, val) {
$('body').append('"'+val+'",');
});
$('body').append('<br>');
window.setTimeout(null, 1000);
}
}
for(var i = 0; i < titles.length; i++)
{
$.ajax({
url: "http://www.imdbapi.com/?t=" + titles[i],
dataType: 'jsonp',
success: makeSuccessHandler(titles, i)
});
}
函数makeSuccessHandler(标题,i){
返回函数(数据){
$('body')。追加(''''+标题[i]+'',');
$。每个(数据、函数(键、值){
$('body')。追加('“+val+'”,');
});
$('body')。追加('br>');
setTimeout(null,1000);
}
}
对于(变量i=0;i
您不能这样做,ajax调用将异步执行。
执行success方法时,索引变量的值将不正确。
如果从success方法中增加i,并且不执行for循环,则可以修复此问题。问题是,如果在循环中调用异步函数,它将使用封闭变量的最后一个赋值
这可以通过使用
函数附录标题(变量标题)
{
返回函数(var数据){
$('body')。追加(''''+title+'',');
$。每个(数据、函数(键、值){
$('body')。追加('“+val+'”,');
});
$('body')。追加('br>');
setTimeout(null,1000);
}
}
用于(标题中的var i)
{
$.ajax({
url:“http://www.imdbapi.com/?t=“+标题[i],
数据类型:“jsonp”,
成功:附录标题(标题[i])
});
}
titles[i]总是返回相同的标题自己翻页显然没有帮助。+1-我认为这比在块外使用处理函数更优雅。
function appendTitle(var title)
{
return function(var data) {
$('body').append('"'+title+'",');
$.each(data, function(key, val) {
$('body').append('"'+val+'",');
});
$('body').append('<br>');
window.setTimeout(null, 1000);
}
}
for(var i in titles)
{
$.ajax({
url: "http://www.imdbapi.com/?t=" + titles[i],
dataType: 'jsonp',
success: appendTitle(titles[i])
});
}