2012-07-12 71 views
1

我正在与JQuery的。当()函数练,当我与执行Ajax调用2种功能。当使用I收到意外的结果与jQuery使用时不同的格式。Ajax响应具有当功能

例如,对于单一功能

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

以下是文件夹,在这种情况下,内容,

enter image description here

然而,在下列情况下,

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

内容的文件夹就像下面的一个实际的Fol der对象位于第一个响应对象的内部。我的意思是我可以通过文件夹[0]访问返回的JSON对象。

enter image description here

以下是getFolders功能,GetFiles的是同为具有AJAX不同的URL getFolders。

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

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

谢谢。

回答

1

这个jQuery AJAX递延总是返回3个参数:数据,textStatus,jqXHR。从服务器返回的数据,根据dataType参数进行格式化;描述状态的字符串;和jqXHR(在jQuery 1.4.x,XMLHttpRequest)对象中。 (from $ .ajax doc http://api.jquery.com/jQuery.ajax/

当您使用$ .when和2个AJAX缓冲区时,这3个参数位于数组中。

从$。当()DOC:http://api.jquery.com/jQuery.when/

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

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

// 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 
}); 
+0

THX的答案。当我使用.when与单个ajax调用时,它不会返回3个参数。只有当内部有2个Ajax调用时才会发生。 – 2012-07-12 19:56:00

+0

对于简单的Ajax调用,您不需要使用$ .when()。当您想等待多个查询(或延迟)时,此功能非常棒。对于一个查询,您可以执行'.ajax()。then(function(res){})'或使用_success_选项。 – odupont 2012-07-12 20:00:17