2016-05-25 10 views
0

プラグインjstreeからjQuery関数の実行を遅延させようとしましたが、別の関数(対象のhtml idを置き換えます)しかし、以下のスクリプトは正しく動作していないようです。メソッドの実行時にjQueryを使用して別の関数を完了するまでの遅延実行

考えられるのは、loadxml()関数がHTMLツリーにデータを埋め込み、jstree()関数を実行してツリービューを適用させるという考え方です。ここ

はHTML

 <div id="jstree" class= "col-md-6 col-xs-6"></div> 

スクリプト

  $.when(loadxml()).then(function(){ 

       $('#jstree').jstree(); 

      }); 



function loadxml(){ 

$.ajax({ 

    url: "xml/categories.xml", 
    dataType: "xml", 
    success: function(catxml){ 
     var categories = new Array(); 
     var outputDisplay = ""; 

     $(catxml).find("Categories").each(function(){ 
      var cid = $(this).find("CategoryID").text(); 
      var cname = $(this).find("CategoryName").text(); 
      var cdescription = $(this).find("Description").text(); 

      categories.push([cid,cname,cdescription]); 
     }); 

     $.ajax({ 
      url: "xml/products.xml", 
      dataType: "xml", 
      success: function(prodxml){ 

       var products = new Array(); 

       $(prodxml).find("Products").each(function(){ 
        var pid = $(this).find("ProductID").text(); 
        var pname = $(this).find("ProductName").text(); 
        var pcatid = $(this).find("CategoryID").text(); 
        var pquantity = $(this).find("QuantityPerUnit").text(); 
        var pprice = $(this).find("UnitPrice").text(); 

        products.push([pid,pname,pcatid,pquantity,pprice]);      
       });    

       outputDisplay += "<ol class='no-bullet'><li>Product List<ol type='i'>" 

       for(i=0; i<categories.length; i++){ 

        outputDisplay += "<li>" + categories[i][1] + "<ol type='a'>"; 

        for(x=0; x<products.length; x++){ 

         if(categories[i][0] == products[x][2]){ 

          outputDisplay += "<li>" + products[x][1] + "</li>";        

         } 

        } 

        outputDisplay +="</ol></li>"; 

       } 

       document.getElementById("jstree").innerHTML = outputDisplay; 


      } 
     }); 




    }  
}); 

}

+1

あなた 'loadXML'機能は、そうでない場合は、' when'を待つのか分からないので、 '約束をreturn'する必要があります! – Bergi

+0

また、 'success'の代わりに' then'を使用する必要があります。そうでなければ、2番目のajaxリクエストを知ることができません。 – Bergi

+0

第1の 'success'から第2のajax(products.xml)を、第2の成功から' .tree() 'を呼び出します。 –

答えて

-1

)は

 $.when(loadxml()).then(function(){ 

      $('#jstree').jstree(); 

     }); 



function loadxml(){ 
var deferred = $.Deferred(); 
    $.ajax({ 
    success : function(){ 
     //code 
     $.ajax({ 

      success: function(){ 
      //your code 
      deferred.resolve(); 

      } 
     }) 
    } 
    }) 

    return deferred.promise(); 


}  

を} defferedあります。

+0

反パターン - ちょうど約束を返す、あなたは新しい遅延オブジェクトを必要としません。 – Adam

+0

こんにちはアダム、申し訳ありません、あなたはここで何をすることを意味するのでしょうか?申し訳ありませんが、私はJSとJqueryの専門家ではありません – ArsedianIvan

+0

@ user3608262 - ilyassの答えはうまくいくでしょうが、必須ではないときに '$ .Deferred'オブジェクトを使うことは反パターンであり、より読みやすいコードにするのは避けるべきです。 '$ .ajax'呼び出しによって返された約束を使って、新しいものと不要なものを作成するのではなく、 – Adam

0

約束:

loadxml().then(function() { 
    $('#jstree').jstree(); 
}); 

function loadxml(){ 

    return $.ajax({/* parameters */}) 
      .then(function(catxml) { 
      //code that runs on the result of the first ajax request 

      //return the promise from the next ajax request 
      return $.ajax({/* parameters */}) 
      }) 
      .then(function(prodxml) { 
       //code that runs on the result of the second ajax request 
      }); 
} 
+0

こんにちはアダム、ありがとう。私はこれを働かせることができませんでした。理由は分かりませんが、私は.thenと両方のインスタンスを使用しようとしましたが、どちらのインスタンスも使用しませんでした – ArsedianIvan

+0

2つのもの?どうしたらうまくいかなかったのですか?エラーが出ましたか?リクエストが完了する前に 'jstree'が実行されましたか?次に、jQueryのバージョンは何ですか?もしそれが<= 1.7.xであれば '.then'の代わりに' .pipe'を使わなければならないかもしれません – Adam

+0

こんにちはアダム、私はそれがうまくいかない原因を考え出しました。私が変数を宣言していた場所と関係していました。私はそれらをグローバル変数にしました。技術的にはうまくいくはずです。しかし、私は、jstree関数のために、あなたの提案されたコードがロード時にスタックしていると思います – ArsedianIvan

関連する問題