1

JQuery .when() 関数で練習していますが、ajax 呼び出しを実行する 2 つの関数で .when を使用すると、予期しない結果が返されます。

たとえば、単一関数の場合

$.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 */
});

フォルダーの内容は次のようになります。実際のフォルダー オブジェクトは、応答の最初のオブジェクト内にあります。つまり、返された JSON オブジェクトには、folders[0] 経由でアクセスできます。

ここに画像の説明を入力

以下は getFolders 関数です。getFiles は、ajax 用に異なる URL を持つ getFolders と同じです。

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

なぜ結果を 2 つの異なる形式で取得しているのか疑問に思っています。

ありがとう。

4

1 に答える 1

1

jQuery AJAX Deferred は、常に data、textStatus、jqXHR の 3 つの引数を返します。サーバーから返されたデータで、dataType パラメータに従って書式設定されています。ステータスを説明する文字列。jqXHR (jQuery 1.4.x では XMLHttpRequest) オブジェクト。($.ajax doc http://api.jquery.com/jQuery.ajax/から)

2 つの AJAX defered で $.when を使用すると、これらの 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 に答える