jquery从多个ajax调用中收集

时间:2013-06-19 02:09:22

标签: javascript jquery

我正在尝试使用jquery和ajax从几个url中收集数据,然后从中创建内容。但是,我必须遗漏一些东西,因为它似乎不起作用。

我有这样的事情:

var html = "";
function loadByUrl(url) {
    $.ajax({
        url: url, 
        dataType: 'json',
        async: false,
        success: function(json) {
          $.each(json.data.children, function(i,item){
            if( someCondition ) {
                $(item.data).appendTo("#content");
            } else {
                html += "<div>" + item.data + "</div>"; 
            }
          }
        }
    });
}

loadByUrl("http://fake1.com");
loadByUrl("http://fake2.com");
loadByUrl("http://fake3.com");
$(html).appendTo("#content");

基本上,如果满足某些条件,我会立即添加内容,否则我想在内容的末尾添加所有其他“已保存”的内容。

我正在尝试做什么?如果是这样,怎么样?

3 个答案:

答案 0 :(得分:5)

新答案:

我会以不同的方式处理这个问题。而不是使用async: false,这通常是不赞成的(它甚至在最新版本的jQuery中被弃用),我会使用$.when来实现相同的效果。

// return a promise
function loadByUrl(url) {
    return $.ajax({
        url: url, 
        dataType: 'json'
    });
}

// handle processing the data in a separate function
function processData(data) {
    var result = '';
    $.each(data.children, function(i,item){
        if( someCondition ) {
             $(item.data).appendTo("#content");
        } else {
            result += "<div>" + item.data + "</div>"; 
        }
    }
    return result;
}

// use when to ensure all of the AJAX requests execute before
// doing anything with their results
$.when(loadByUrl("http://fake1.com"), loadByUrl("http://fake2.com"), loadByUrl("http://fake3.com")).done(function(fake1, fake2, fake3) {
    // this function is called after all three AJAX promises are resolved
    var html = '';

    html += processData(fake1[0]);
    html += processData(fake2[0]);
    html += processData(fake3[0]);

    $(html).appendTo("#content");
});

原始答案:

问题是$.ajax是异步的。尝试替换此行:

html += "<div>" + item.data + "</div>";

有了这个:

$("<div>" + item.data + "</div>").appendTo("#content");

答案 1 :(得分:0)

编辑:我刚看到这些是同步请求。如果你想坚持同步请求,我想你想看看this answer。我从未使用同步选项,但我确定您没有指定回调函数。如果您不介意切换到异步,我认为答案底部的代码仍然可以使用。

您尝试将此内容附加到页面有两个位置。首先,有第10行:

$(item.data).appendTo("#content");

这应该可以正常工作,假设你按自己喜欢的方式写下自己喜欢的条件。第二位是最后一行:

$(html).appendTo("#content");

这将在加载内容之前触发,将空白的html字符串附加到文档。诀窍是理解AJAX请求和第二个附件立即执行,但是在服务器发回所请求的信息之前,success函数将结果加载到变量html中。 / p>

我对如何解决这个问题的答案取决于第9行中检查的条件类型。如果它可以通过事件监听器检测到,我会重写success除了存储结果之外什么都不做在全局html变量中,然后编写第二个事件侦听器,在满足条件时触发,将html的内容附加到目标然后清除它。但是,如果使用事件监听器无法检测到该条件,我会将您的代码更改为以下内容:

var html = "";
function loadByUrl(url) {
    $.ajax({
        url: url, 
        dataType: 'json',
        success: function(json) {
            $.each(json.data.children, function(i,item){
                html += "<div>" + item.data + "</div>";
                if( someCondition ) {
                    $(html).appendTo("#content");
                }
            });
        });
}

loadByUrl("http://fake1.com");
loadByUrl("http://fake2.com");
loadByUrl("http://fake3.com");

如果您想在加载完fake3.com之后强行添加,请使用闭包执行以下操作:

var html = "";
function successFunction(force)
{
    return function(json) {
        $.each(json.data.children, function(i,item)
        {
            html += "<div>" + item.data + "</div>";
            if (force || someCondition)
            {
                $(html).appendTo("#content");
            }
        });
    };
}
function loadByUrl(url,force) {
    $.ajax({
        url: url, 
        dataType: 'json',
        success: successFunction(force)});
}

loadByUrl("http://fake1.com",false);
loadByUrl("http://fake2.com",false);
loadByUrl("http://fake3.com",true); // true => force appension.

答案 2 :(得分:0)

如果它不是Nir指出的跨域调用,请尝试在您的ajax调用中使用“.done”并在那里的回调函数中进行追加。

有点像

$.ajax({
   your call setup and call
}).done(function(data) {
   console.log('Data:',data);  
   //your code to append the data 
}

这可以使用“.done”,因为jQuery 1.5中$ .ajax()返回的jqXHR对象实现了Promise模式。您可以查看http://api.jquery.com/jQuery.ajax/

上的文档