2013-05-13 4 views
0

У меня есть функция javaScript, которая использует библиотеку Buckets, и она должна вернуть значение в html. Я использовал console.log, чтобы видеть данные внутри функции, и это не пусто. Но на html он сказал «undefined».Почему функция не возвращает значение?

Это мой JS код:

function transformToStruct(xmlData) 
{ 
    var data = xmlData.item; 
    var myReturn; 
    $.getScript("buckets-minified.js", function() 
    { 
     var treeData = new buckets.MultiDictionary(); 
     $.each(data, function(i,val) 
     { 
      if(typeof data == 'object') 
      { 
       $.each(val, function(j, childVal) 
       { 
        var dict = new buckets.Dictionary(); 
        dict.set(val["NodeId"]["#text"], val["NodeText"]["#text"]); 
        treeData.set(val["ParentId"]["#text"], dict); 

       }); 
      } 
     }); 
     console.log(treeData) 
     return treeData;   
    }); 
} 

Это на странице HTML, что я называю функцией transformToStruct:

var myGTP = new buckets.MultiDictionary(); 

$.ajax({ 
    url: "http://frparlself6.dhcp.par.xxxx.corp:8000/com/sap/st/ltst/LTST_Backend/frontAccess/example.xsjs?structureId=" + structureId, 
    dataType : 'jsonp', 
    type:'GET' 
}).always(function() {  
    var sXml = _JSONFromHANA.body 
    var xmlData = $.parseXML(sXml); 
    var xml = xmlToJson(xmlData); 
    var items = xml["soap-env:Envelope"]["soap-env:Body"]["n0:_-qte_-rfcReadStrucNodesResponse"]["EtNodes"]; 
    myGTP = transformToStruct(items); 
    console.log(myGTP); 
}); 

Любые идеи?

+2

Вам нужно понимать асинхронные вызовы и функции внутри функций. –

ответ

0

treeData - это возвращаемое значение анонимной функции, которую вы передаете в качестве аргумента функции getScript. Ваша функция transformToStruct фактически не имеет собственного возвращаемого значения, поэтому неудивительно, что это undefined. Поскольку getScript работает асинхронно, вы можете использовать обратный вызов вместо возвращаемого значения:

function transformToStruct(xmlData, callback) 
{ 
var data = xmlData.item; 
var myReturn; 
$.getScript("buckets-minified.js", function() 
{ 
    var treeData = new buckets.MultiDictionary(); 
    $.each(data, function(i,val) 
    { 
     if(typeof data == 'object') 
     { 
      $.each(val, function(j, childVal) 
      { 
       var dict = new buckets.Dictionary(); 
       dict.set(val["NodeId"]["#text"], val["NodeText"]["#text"]); 
       treeData.set(val["ParentId"]["#text"], dict); 

      }); 
     } 
    }); 
    console.log(treeData) 
    callback(treeData);   
}); 
} 

Ваш вызов функции будет выглядеть следующим образом:

var myGTP = new buckets.MultiDictionary(); 

$.ajax({ 
    url: "http://frparlself6.dhcp.par.xxxx.corp:8000/com/sap/st/ltst/LTST_Backend/frontAccess/example.xsjs?structureId=" + structureId, 
    dataType : 'jsonp', 
    type:'GET' 
}).always(function() {  
    var sXml = _JSONFromHANA.body 
    var xmlData = $.parseXML(sXml); 
    var xml = xmlToJson(xmlData); 
    var items = xml["soap-env:Envelope"]["soap-env:Body"]["n0:_-qte_-rfcReadStrucNodesResponse"]["EtNodes"]; 
    transformToStruct(items, function(result) { 
     myGTP = result; 
     console.log(myGTP); 
    }); 

}); 

Но, как упоминалось в комментариях, вероятно, вы должны прочитать что-то об асинхронных функциях.

+0

Я раньше не знал об асинхронности. Я так новичок в javaScript и jQuery. Большое спасибо. – user2335149

Смежные вопросы