2012-02-13 25 views
0

私はJITを使用してspacetreeを作成していますが、サーバーから返されるデータは適切な形式ではないため、正しい形式の文字列を作成するのが最も簡単だとわかりました。それをevalで解析します(これはうまくいきます)。問題は今、スペースツリーに子ノードを追加するための適切な形式ではないJSONの別の文字列を使用する必要があることになり、私は現在何をしているのか分かりません。ここに私のコードは次のとおりです。関数内の変数javascript内の関数ですか?

function grabdata(empid, fname, lname){ 
    var json = ''; 
    jQuery.getJSON('../../Mobile_ReportingChain.cfm?Empid='+empid, function(data) { 
     console.log(data); 
     for(var i=data.DATA.length-1; i>=0; i--){ 
      json = json + 'id: "' + data.DATA[i][3] + '",name: "' + data.DATA[i][0] + ' ' + data.DATA[i][1] + '",data: {},children: [{'; 
     } 
     json = json + 'id: "' + empid + '",name: "' + fname + ' ' + lname + '",data: {},children: ['; 
     alert("JSON 1: " + json); 
     jQuery.getJSON('../../Mobile_Subordinate.cfm?Empid='+empid, function(data2) { 
      console.log(data2); 
      for(var i=0; i<data2.DATA.length; i++){ 
       json = json + '{id: "' + data2.DATA[i][4] + '",name: "' + data2.DATA[i][0] + ' ' + data2.DATA[i][1] + '",data: {},children: []},'; 
      } 
      alert("JSON 2: " + json); 
     }); 
     json = json + ']'; 
     for(var i=data.DATA.length; i>0; i--){ 
      json = json + '}]'; 
     } 
     alert("JSON 3: " + json); 
    }); 
} 

は、ここで私は、アラートからなってんだよ、と何私の目標は次のとおりです。

JSON 1: id: "000-25-9687",name: "NAME1   LNAME1     ",data: {},children: [{id: "000-91-3619",name: "FNAME2   LNAME2     ",data: {},children: [{id: "000-01-2302",name: "FNAME3   LNAME3     ",data: {},children: [{id: "000-14-7189",name: "FNAME4   LNAME4     ",data: {},children: [{id: "000-62-7276",name: "FNAME5 LNAME5",data: {},children: [ 

JSON 2: id: "000-25-9687",name: "NAME1   LNAME1     ",data: {},children: [{id: "000-91-3619",name: "FNAME2   LNAME2     ",data: {},children: [{id: "000-01-2302",name: "FNAME3   LNAME3     ",data: {},children: [{id: "000-14-7189",name: "FNAME4   LNAME4     ",data: {},children: [{id: "000-62-7276",name: "FNAME5 LNAME5",data: {},children: []}]}]}]}]{id: "000-21-6506  ",name: "CHILD1   CHILDLNAME1     ",data: {},children: []},{id: "000-17-7989  ",name: "CHILD2   CHILDLNAME2     ",data: {},children: []},{id: "000-23-6712  ",name: "CHILD3  CHILDLNAME3    ",data: {},children: []}, 

JSON 3: id: "000-25-9687",name: "NAME1   LNAME1     ",data: {},children: [{id: "000-91-3619",name: "FNAME2   LNAME2     ",data: {},children: [{id: "000-01-2302",name: "FNAME3   LNAME3     ",data: {},children: [{id: "000-14-7189",name: "FNAME4   LNAME4     ",data: {},children: [{id: "000-62-7276",name: "FNAME5 LNAME5",data: {},children: []}]}]}]}] 

JSON 4: id: "000-25-9687",name: "NAME1   LNAME1     ",data: {},children: [{id: "000-91-3619",name: "FNAME2   LNAME2     ",data: {},children: [{id: "000-01-2302",name: "FNAME3   LNAME3     ",data: {},children: [{id: "000-14-7189",name: "FNAME4   LNAME4     ",data: {},children: [{id: "000-62-7276",name: "FNAME5 LNAME5",data: {},children: [{id: "000-21-6506  ",name: "CHILD1   CHILDLNAME1     ",data: {},children: []},{id: "000-17-7989  ",name: "CHILD2   CHILDLNAME2     ",data: {},children: []},{id: "000-23-6712  ",name: "CHILD3  CHILDLNAME3    ",data: {},children: []},]}]}]}]}] 

明らかにそれは過去に移動すると、それは時間を持って前にJSON3アラートを作るものがやっていますJSON2アラートを取得してビルドします。どのように私はそれを停止し、そのgetJSON呼び出しが完了するのを待って、成功関数が終了する前に終了するのですか?一般的なルールとして

答えて

0

、あなたは非同期呼び出しが完了する前にを実行しようとしている呼び出し後のスクリプトで非同期呼び出し(のようなjQuery.getJSON)、何かを作っている場合。

あなたは物事が明確crsytal、あなたがこのようなコードを書くことができます保持する場合:

function grabdata(empid, fname, lname){ 
    jQuery.getJSON('../../Mobile_ReportingChain.cfm?Empid='+empid, function(data) { 
     jQuery.getJSON('../../Mobile_Subordinate.cfm?Empid='+empid, function(data2) { 

      // DO ALL YOUR STUFF WITH data AND data2 HERE 

     }); 
    }); 
} 

それは最適ではないのですが、それは両方のAJAX呼び出しが最も内側のブロック内のコードの前に完了しなければならないことは明らかだが実行されます。


あなたが複数の同時AJAXリクエストのより高度な処理として探しているなら、あなたはjQuery.when()と2つのasynce要求の完了時に実行される約束を作成することができます。

$.when(
    $.getJSON('../../Mobile_ReportingChain.cfm?Empid='+empid), 
    $.getJSON('../../Mobile_Subordinate.cfm?Empid='+empid) 
).done(function (data, data2){ 

      // DO ALL YOUR STUFF WITH data AND data2 HERE 

}); 
+0

私が必要としていたことを完全に遂行したので、必要なときに$ .when()*を調べます。 :) – Rob

0

アム私は正しくここにあなたを理解する:

はここで例です?あなたは、サーバー

  • Mobile_ReportingChain.cfm EMPID =
  • Mobile_Subordinate.cfmには、2つの呼び出しを行う必要がありますか? Empid =

これらの2つの呼び出しは互いに独立していますが、どちらかというと最初に してください。両方から返されたデータは処理され、文字列に結合される必要があります。あなたのコードの基本的な構造は、あなたがここに2つの非同期呼び出しを持っている

1 function grabdata(...){ 
2 // this variable is availabe to all functions 
3 var json = ''; 
4 jQuery.getJSON('Mobile_ReportingChain.cfm?Empid='+empid, function(data) { 
5  // when data from Mobile_ReportingChain finally arrives: process and add to var json: 
6  json = json + .... 
7 
8  jQuery.getJSON('Mobile_Subordinate.cfm?Empid='+empid, function(data2) { 
9    // when data from Mobile_Subordinate finally arrives: process and add to var json: 
10   json = json + .... 
11  }); 
12 
13  // add some more stuff from Mobile_ReportingChain data to json 
14  json = json + '..... 
15 }); 
16 } 

あるので、これが起こる実際の順序があるかもしれないです:

  • 1、2、3、4(非同期Mobile_ReportingChainに呼び出します)、16.完了。

    • 5、6、7、8(非同期Mobile_Subordinateに呼び出す)、13、14:Mobile_ReportingChainからのデータが最後に到着したときに機能 戻り、VaRのJSONは、

    秒後に永遠に失われています。関数 が返されます。

秒後、Mobile_Subordinateからのデータは最終的に到着したとき:

  • 9、10、機能に戻ります。

ここでは実際に試してみることができるa jsfiddleです。それを試してみa jsfiddle:再び

function grabdata() { 

    $.when($.ajax(url1), $.ajax(url2)).then(

    function(d1, d2) { 
     console.log('both calles returned'); 
     console.log('call 1 returned ' + d1[0].length + ' bytes of data'); 
     console.log('call 2 returned ' + d2[0].length + ' bytes of data'); 

     // here is where you do more stuff with the data 

    }); 

    console.log('at the end of grabdata().'); 
    // nothing intresing to do, nothing to return 

} 

:このような状況に対処するために、その後、+とき

jQueryのは、繰延オブジェクトを提供しています。

関連する問題