2012-01-17 19 views
1

目前,我有以下代码:找出当两个JSON请求已经完成

function render(url1, url2, message) { 
    utility.messageBoxOpen(message); 

    $.getJSON(url1, function (items) { 
     // Do something 

     utility.messageBoxClose(); 
    }); 

    $.getJSON(url2, function (items) { 
     // Do something 
    }); 
} 

当函数执行模式窗口出现,通知的东西是加载用户。最初,我只有一个$ getJSON请求,所以当请求完成时,模式窗口按照上面的代码关闭。

我正在寻找添加另一个$ getJSON请求,但只想在两个$ getJSON请求都完成时才关闭模式窗口。

达到此目的的最佳方法是什么?

+0

你可以比“当$ getJSON请求都完成时”更具体一些?你是说当两者都完成了吗?你的意思是两人都成功返回吗? – Sinetheta 2012-01-18 00:23:13

回答

2

您正在寻找$.when()

所有的jQuery Ajax请求(包括类似的getJSON快捷键),它可以用来控制其他行动回报延迟对象。

var dfd1 = $.getJSON(url1, function (items) { 
    // Do something  
}); 

var dfd1 = $.getJSON(url2, function (items) { 
    // Do something 
}); 

$.when(dfd1, dfd2).then(function(){ 
    //both succeeded 
    utility.messageBoxClose(); 
},function(){ 
    //one or more of them failed 
}); 

如果你不在乎是否getJSONs回来成功与否,而是只关心他们这样做,则可以改为:

$.when(dfd1, dfd2).done(utility.messageBoxClose); 
2

变量

function render(url1, url2, message) { 
utility.messageBoxOpen(message); 
var isOneDone = false; 
$.getJSON(url1, function (items) { 
    // Do something 
    if(!isOneDone) 
     isOneDone = true; 
    else 
     utility.messageBoxClose(); 
}); 

$.getJSON(url2, function (items) { 
    // Do something 

    if(!isOneDone) 
     isOneDone = true; 
    else 
     utility.messageBoxClose(); 
}); 

}

0

可以更换使用$.ajaxgetJSON()呼叫其中一个完成同样的事情,但给你更多的灵活性:

$.ajax({ 
    url: http://whatever, 
    dataType: 'json', 
    async: false, 
    data: {data}, 
    success: function(data) { 
    // do the thing 
    } 
}); 

注意async:false部分 - 这会使代码执行暂停,直到请求完成。因此,您可以简单地使用这种方式进行两次调用,并在第二次调用完成后关闭对话框。

+1

请勿使用'async:false'。这几乎总是错误的方法。 – 2012-01-18 00:01:05

+0

我不同意,特别是如果调用已知是非常低的延迟。虽然有些方法可以“伪造”同步性,但我所见过的大部分都过于复杂或脆弱。这是80/20的规则,在大多数情况下,无论如何你都在进行同步通话并不重要。如果确实如此,那么你可能有更大的问题。 – kprobst 2012-01-18 00:11:59

0
function render(url1, url2, message) { 
    utility.messageBoxOpen(message); 
    $.when($.getJSON(url1, function (items) { 
     // Do something 
     utility.messageBoxClose(); 
    }), $.getJSON(url2, function (items) { 
     // Do something 
    })).then(function() { 
     //Both complete 
    }); 
} 

jQuery.when

相关问题