Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/425.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ajax调用中的数组_Javascript_Jquery_Ajax_Arrays - Fatal编程技术网

Javascript ajax调用中的数组

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)

我有以下代码从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) {
            $('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])
    });
}