2012-07-12 40 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