1

我正在使用 JQuery .when() 函数进行练习,当我将 .when 与 2 个执行 ajax 调用的函数一起使用时,我收到了意想不到的结果。

例如,对于单个功能

$.when(getFolders(id)).then(function(folders) {
     /* return value is as expected */
});

以下是本例中文件夹的内容,

在此处输入图像描述

但是,在以下情况下,

$.when(getFolders(idOfClickedFolder), getFiles(idOfClickedFolder))
   .then(function( folders, files ) {
      /* results formats are not similar here with above one */
});

文件夹的内容如下所示,实际的文件夹对象位于响应的第一个对象内。我的意思是我可以通过文件夹 [0] 访问返回的 JSON 对象。

在此处输入图像描述

以下是 getFolders 函数,getFiles 与 getFolders 相同,但 ajax 具有不同的 url。

function getFolders(rootId) {
    return $.ajax({
        url: '/FileManager/GetFolders/' + rootId,
        async: true,
        dataType: 'json'
    });
}

我想知道为什么我会以两种不同的格式获得结果。

谢谢。

4

1 回答 1

1

jQuery AJAX Deferred 总是返回 3 个参数:data、textStatus、jqXHR。服务端返回的数据,根据dataType参数格式化;描述状态的字符串;和 jqXHR(在 jQuery 1.4.x 中,XMLHttpRequest)对象。(来自 $.ajax 文档http://api.jquery.com/jQuery.ajax/

当您将 $.when 与 2 个 AJAX 延迟一起使用时,这 3 个参数位于一个数组中。

来自 $.when() 文档:http ://api.jquery.com/jQuery.when/

$.when( $.ajax("test.aspx") ).then(function(ajaxArgs){ 
     alert(ajaxArgs[1]); /* ajaxArgs is [ "success", statusText, jqXHR ] */
});

如果你想创建一个只返回第一个参数的自定义 AJAX Deferred,你可以这样做:

// creating a new deferred
var myDfd = $.Deferred();

// execute AJAX query, and when the query is okay, resolve my deferred with only the res of the AJAX query
$.ajax({
   url: '/FileManager/GetFolders/' + rootId,
   async: true,
   dataType: 'json'
}).then(function(folders) {
   myDfd.resolve(folders);
});

// I can use my own Deferred
$.when(myDfd).then(function(folders) {
  // folders contains ajax response only
});
于 2012-07-12T19:48:15.460 回答