有人能清楚地解释jQuery.when()和deferred.then()是如何工作的吗?

Gab*_*iel 8 jquery jquery-deferred

我正在开发一个Web应用程序,我需要加载几个文件$ .ajax.我在$ .when().then()中发现了一些有趣的东西.

当我没有与请求返回的数据有任何特殊关系时,它很有用,如下例所示:

$.when(
    $.getScript('js/script1.js'),
    $.getScript('js/script2.js')
).then(function(){
    // Do whatever I want once both scripts are loaded...
});
Run Code Online (Sandbox Code Playgroud)

如果我有一个像这样的ajax请求,那么效果很好:

$.when(
    $.ajax('xml/myxml.xml')
).then(function(data){
    // Here I can work with data like I would with a regular ajax request
    alert($(data).find('mynode').text());
})
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试以下操作,我无法让它工作:

$.when(
    $.ajax('xml/myxml.xml'),
    $.getScript('js/script.js')
).then(function(data){
    // But here, I can't access $(data).find('mynode')...
})
Run Code Online (Sandbox Code Playgroud)

我读了延迟对象页面,但大多数对我来说太技术了,我无法理解当我使用$ .when().then()加载时我应该能够获取我的ajax数据来自多个来源的脚本和数据.

因此,如果有人可以帮助我在上面的测试用例中找到如何使用我的ajax数据,那就太棒了!如果在此期间有人能够以比官方jQuery文档更容易理解的方式解释延迟对象的事情,那就太棒了!

谢谢!

Fel*_*ing 3

显然,对于每个延迟对象,至少如果它是 Ajax 请求,都会向回调$.when传递一个参数。是一个表示 XMLHttpRequest 的对象(更多信息请参见文档)。所以以下应该有效:[ "success", statusText, jqXHR ]jqXHR$.ajax

$.when(
    $.ajax('xml/myxml.xml'),
    $.getScript('js/script.js')
).then(function(a){
    $(a[2].responseText).find('mynode');
});
Run Code Online (Sandbox Code Playgroud)

请参阅文档中的第一个示例$.when

关于一般的延迟对象,也许这个问题有帮助。