2017-01-04 4 views
0

(以下マイ溶液)フィルアレイ、その後、別の関数に配列を渡す

私は情報がデータベースに格納されたクラス.canvas-backgroundを有するいくつかのHTML要素を有しています。私は各要素の情報を取得し、JavaScriptで処理したいと考えています。しかし、どういうわけか、AJAXリクエストの応答を別の関数に渡すことはできません。 (1)

function initTabs() { 
    var tabs = loadTabInformation(); 
    console.log(tabs); // (1) 
    // do something else 
} 

function loadTabInformation() { 
    var requests = new Array(); 
    var tabs = new Object(); 
    var counter = 0; 
    $(".canvas-background").each(function() { 
     var tabNumber = $(this).data("tab-number"); 
     var request = $.ajax({ 
      type: 'POST', 
      url: '../db/GetTabInformation.ashx', 
      data: String(tabNumber), 
      dataType: 'json', 
      contentType: 'text/plain; charset-utf-8' 
     }) 
     .done(function (response) { 
      tabs[counter++] = response; 
     }).fail(function (jqXHR, textStatus, errorThrown) { 
      console.log("request error in loadTabInformation()"); 
      console.log(textStatus); 
      console.log(errorThrown); 
     }); 
     requests.push(request); 
    }); 
    $.when.apply($, requests).done(function() { 
     console.log(tabs); // (2) 
     return tabs; 
    }); 
} 

私はundefinedを得るが、(2)ですべてが大丈夫であるように思わ:ここでは、私が試したものです。

解決の答えと@Kimホアンが、私はこの作業を持ってコメント内のリンクに

感謝。手がかりは、私の場合はinitTabs()ある呼び出し元の関数にdone()機能を置くように見えました。私が間違ってましたもう一つは、 AJAX要求が行われ、コールバック関数の外で終えた後を実行する必要があるロジックを実行しようとしました。彼らは内にいなければなりません(あなたがそれについて考えるなら、意味をなさない)。そして、どんな関数がどのような種類のオブジェクトを返すかを知るために、豊富なconosle出力が助けになりました。

function initTabs() { 
    var tabInfoRequest = loadTabInfo(); 
    tabInfoRequest[0].done(function() { 
     var results = (tabInfoRequest[1].length > 1) ? $.map(arguments, function(a) { return a[0]; }) : [arguments[0]]; 
     for (var i = 0; i < results.length; i++) { 
      // do something with results[i] 
     } 
    }); 
} 

function loadTabInfo() { 
    var tabNumbers = new Array(); 
    $(".canvas-background").each(function() { 
     tabNumbers.push($(this).data("tab-number")); 
    }); 
    var requests = $.map(tabNumbers, function (current) { 
     return $.ajax({ 
      type: 'POST', 
      url: '../db/GetTabInformation.ashx', 
      data: String(current), 
      dataType: 'json', 
      contentType: 'text/plain; charset-utf-8' 
     }); 
    }); 
    var resultObject = new Object(); 
    resultObject[0] = $.when.apply($, requests); 
    resultObject[1] = requests; 
    return resultObject; 
} 

注:私はinitTabs()機能で配列requestsを必要とするので、私は唯一のresultObject -thingをしました。

私を助けてくれてありがとう!

答えて

4

loadTabInformationに何も返さないので、もちろんundefinedが返ってきます。

function loadTabInformation() { 
    ... 
    return $.when.apply($, requests); 
} 

function initTabs() { 
    loadTabInformation().done(function (tabs) { 
     console.log(tabs); // (1) 
     // do something else 
    });  
} 
+0

OKこれは私を解決に近づけます。しかし、 'done'内の関数の' tabs'パラメータには最初の応答しか含まれていません。 'tabs2'と' tabs3'をパラメータとして追加しようとしましたが、私は3つの応答をすべて得ました。可変数の応答に対してこれを行うことは可能ですか? – elementzero23

+1

@ elementzero23、このスレッドhttp://stackoverflow.com/questions/22416073/when-and-done-using-an-array-with-doneを見て、$で約束事を処理する方法があります。いつ。基本的にはargumentsオブジェクトを使用する必要があり、各引数には[data、statusText、jqXHR] –