从jQuery发出GET请求的问题

时间:2011-12-19 22:26:22

标签: javascript jquery asynchronous

我正在尝试使用jQuery get()函数发出HTTP GET请求,但是我遇到了一些麻烦。

以下是我的代码:

// get the links on the page
var pageLinks = $.find('#pageLinks');
// loop through each of the links
$(pageLinks).find('a').each(function(){
   if($(this).attr('title') !== "Next Page"){
       // make a GET request to the URL of this link
   $.get($(this).attr("href"), function(data) {
           console.log("here");
           var temp = parse_page(data);
           // concatenate the return string with another
           bdy = bdy+String(temp);
           console.log("done");
       });
   }
});

我需要多个页面来获取数据。由于get()函数是异步的,因此我以随机顺序获取页面。其次,连接不起作用。即使我得到了每个页面,但它们都没有被放入bdy

有人可以建议我如何处理这件事吗?

非常感谢!!

4 个答案:

答案 0 :(得分:0)

在检索完所有页面后构造bdy,即将get存储在字典或数组中;等待所有get完成;然后以正确的顺序组装它们。

答案 1 :(得分:0)

我试过这个并且它有效:

// get the links on the page
var pageLinks = $('a');
var bdy 
// loop through each of the links
$(pageLinks).each(function(){
console.log(this);
       // make a GET request to the URL of this link
           $.get($(this).attr("href"), function(data) {

           // concatenate the return string with another
           bdy = bdy + data.toString();
           console.log(bdy);
       });

});

答案 2 :(得分:0)

作为@muratgu所说的例子:

var results = [];
var count = 0;

function allDone() {
    var bdy = results.join("");
    // do stuff with bdy
}

// get the links on the page
var pageLinks = $.find('#pageLinks');

// filter the links so we're left with the links we want
var wantedLinks = $(pageLinks).find('a').filter(function (idx) {
    return $(this).attr('title') !== "Next Page";
});

// remember how many links we're working on
count = wantedLinks.length;

// loop through each of the links
wantedLinks.each(function (idx) {
    // make a GET request to the URL of this link
    $.get($(this).attr("href"), function (data) {
        console.log("here");
        var temp = parse_page(data);
        results[idx] = temp;

        // Decrement the count.
        count--;

        if (count === 0) {
            // All done.
            allDone();
        }
    });
});

您可以进一步将其抽象为可以执行N个异步下载的数据类型,然后在完成所有内容后通知您。

答案 3 :(得分:0)

我刚刚发现有一些模块可以让人来管理JS中的控制流程。我发现的是:

有关使用上述模块的帮助,请参阅我的后续问题here