2016-10-08 16 views
0

が定義されています機能戻り、私は機能の簡単な一連の持っている

convertXML(); 

    function convertXML(){ 

     var xmlObj = xmlToJson(xml.responseXML) 
      .query.results.WMS_Capabilities; 
     console.log("convertXML"); 

     (function checkReturn(){ 
      if(typeof xmlObj != 'undefined'){ 
      return (function(){ return createData(xmlObj)})(); 
      } 
      else { 
       setTimeout(checkReturn, 50); 
      } 
     })(); 
    } 

    function createData(xmlObj){ 
     for (var i = 0; i < xmlObj.Capability.Layer.Layer.length; i++){ 
      var row={}; 
      row = xmlObj.Capability.Layer.Layer[i]; 
      WMSLayers.push(row); 
     }; 
     console.log("createdata",WMSLayers) 

     return (function(){return finish()})(); 
    } 

    function finish(){ 
     console.log(n == Server.length-1) 
     if (n == Server.length-1){ 
      //n is defined as an argument 
      //this code is a part of a bigger function 
      //same for Server variable 
       createTable(); 

      }; 
    } 

問題はconvertXML機能が時々xmlObj変数undefinedでコールバック関数createDataを返すということです。だから私は変数がコールバック関数を呼び出すために定義されているかどうかをチェックする必要があります。

私の質問は、すべての変数のデータロードが終了したときに返される関数ではありませんか?

var req = { 
    "type" :"GET", 
    "dataType":"XML", 
    "data" : null, 
    "url"  : url 
}; 

//make the request (ajax.js) 
ajax(req,ajaxSuccess,ajaxError); 

function ajax(prop,onsuccess,onerror){ 
// data = data || null; 
// var url = "wps"; // the script where you handle the form input. 

$.ajax({ 
    type: prop.type, 
    dataType: prop.dataType, 
    data: prop.data, 
    url: prop.url, 
    success: function (data, textStatus, xhr) { 
     console.log(xhr) 
     onsuccess(xhr); 
    }, 
    error:function (data ,textStatus, xhr) { 
     onerror(xhr); 
    } 

}); 
// e.preventDefault(); 
} 

function ajaxSuccess(xhr){ 
    $("#messages").append(
     '<span style="color:blue">' + 
     getFullTime() + 
     '</span> Response HTTP status <b>' + 
     xhr.status + 
     ' [' + xhr.statusText + ']' + 
     '</b> from:' + 
     ' <a style="color:grey;text-decoration:none;" href="' + 
     url+ 
     '" target="_blank">'+ 
     Server[i].link + 
     Request["getCapabilities"]+ 
     '</a><br>' 
    ); 

    //create the wms 
    createWMS(xhr, Server[i],i);//this is where the convertXML,createData and finish functions are located 

     }; 
+2

うわー......ちょっと...... - >戻る(機能(){戻り終了()})();うわ! – adeneo

+0

'xml'はどこに定義されていますか? – guest271314

+0

あなたは何か非同期的なものを扱っているようですので、完了したかどうかを確認するために再帰関数を使用する必要があります。これはおそらく最良の方法ではありません – adeneo

答えて

1

あなたは$.get()complete機能を使用することができます。

UPDATEは

これは私が要求を作る方法です。注:nは、finishファンクション内で定義されていないようです。

function convertXML(xml, textStatus, jqxhr) { 
    var xmlObj = xmlToJson(jqxhr.responseXML) 
       .query.results.WMS_Capabilities; 
    console.log("convertXML"); 

    if (typeof xmlObj != 'undefined') { 
     createData(xmlObj); 
    } 
} 

function createData(xmlObj){ 
    for (var i = 0; i < xmlObj.Capability.Layer.Layer.length; i++){ 
     var row = xmlObj.Capability.Layer.Layer[i]; 
     WMSLayers.push(row); 
    }; 
    console.log("createdata",WMSLayers) 
    finish(); 
} 

$.get("/path/to/resource", convertXML, "xml") 
.fail(function(jqxhr, textStatus, errorThrown) { 
    console.log(errorThrown) 
}); 
+0

ありがとう。しかし、私の問題を解決することはできません。私は応答データ 'jqxhr'に' .fail() 'のようにコールバックでアクセスする必要があります。 – mrapsogos

+0

@mrapsogos _"しかし、私の問題を解決できません。応答データ 'jqxhr'は' .fail() '"のようにコールバックでも "_? 'convertXML'コールバックで' jqxhr'を利用できます – guest271314

+0

更新を確認してください – mrapsogos

関連する問題