For循环中的XMLHttpRequest

时间:2014-10-05 00:23:00

标签: javascript for-loop xmlhttprequest

这段代码应该遍历几个网页并查找每个页面上的所有链接,并在控制台中列出它们,但它似乎只列出了最后一个网页的链接(fakeURL.com/735)。

我如何让console.log(url);为每次迭代工作,而不仅仅是最后一次(即i = 735时)?

for(i = 0; i <= 735; i += 15) 
{
    var xhrs = new XMLHttpRequest();
    xhrs.open("get", 'http://fakeURL.com/' + i, true);
    xhrs.onreadystatechange = function() 
    {
        if (xhrs.readyState == 4) 
        {
            $(xhrs.responseText).find('a').each(function()
            {           
                var url = $(this).attr('href');
                console.log(url);                                               
            });
        }
    }
        xhrs.send();
}

1 个答案:

答案 0 :(得分:0)

您的问题是,您正在为所有ajax调用重复使用相同的xhrs变量。因此,当xhrs事件触发时,所有正在进行的调用都无法找到属于其特定请求的onreadystatechange变量。因此,他们最终都会查看上一个请求中的xhrs.readyState,因此您只能看到上一个请求已完成。

您应该可以切换到使用this来引用生成onreadystatechange事件的请求:

for(i = 0; i <= 735; i += 15) {
    var xhrs = new XMLHttpRequest();
    xhrs.open("get", 'http://fakeURL.com/' + i, true);
    xhrs.onreadystatechange = function() 
    {
        if (this.readyState == 4) 
        {
            $(this.responseText).find('a').each(function()
            {           
                var url = $(this).attr('href');
                console.log(url);                                               
            });
        }
    }
    xhrs.send();
}

正如其他人所说,如果$表示您正在使用jQuery,那么jQuery.ajax()可能会更容易。