2012-07-30 91 views
0

我无法返回一个JSON对象,而是我得到的是一个未定义的变量。我不能返回我的json对象

这段代码应该从API返回一个json元素。这似乎在成功的工作:功能,但一旦我尝试采取数据在其他地方,它只是显示“未定义”

var datas; 
datas = getdata(); 
//getdata(); 
createChart(datas) 

alert('2datass'+datas); // this returns undefined 

function createChart(data){ 
    alert(data); //outputs undefined 
} 

function getdataaa(){ 
    alert('ajax'); 
    $.ajax({ 
     type: "GET", 
     dataType: "json", 
     url: "API URL", 
     success: function(data){ 

      alert(data); // WORKS! and outputs my JSON data 
      /* 
       for(var i =0;i <= data.length-1;i++) 
       { 
       var item = data[i]; 

       datas = datas + { 
       type: 'column', 
       name: item.name, 
       data: [item.difference] 
       }; 
       } 
      */ 

      //Neither of these returns seems to work 
      return jQuery.parseJSON(data); 
      return data; 
     } 
    }); 
}; 

任何帮助,将不胜感激。

SOLUTION

感谢所有帮助过我的人。

这似乎这样的伎俩

 var datas; 
     datas = getData(); 
     //getdata(); 

     alert('2datass'+datas); 
     console.log(datas); 
     createChart(datas); 


     function createChart(data){ 

      alert('createChart'+data); 
      var dynamicData; 


        for(var i =0;i <= data.length-1;i++) 
        { 
         var item = data[i]; 

         dynamicData = dynamicData + { 
          type: 'column', 
          name: item.name, 
          data: [item.difference] 
         }; 

        } 

      alert('dynamic' +dynamicData); // works, but says undefined before - outputs dynamic undefined[object Object][object Object][object Object][object Object][object Object] 



      var series = [dynamicData,{ 
        type: 'column', 
        name: 'Jane', 
        data: [300, 30] 
       }, { 
        type: 'column', 
        name: 'John', 
        data: [-200, 50] 
       }, { 
        type: 'column', 
        name: 'Joe', 
        data: [444, -25] 
       }, { 
        type: 'column', 
        name: 'Jobe', 
        data: [444, -25] 
       }, { 
        type: 'column', 
        name: 'Jooe', 
        data: [444, -25] 
       },{ 
        type: 'column', 
        name: 'Jane', 
        data: [300, 30] 
       } 
       , { 
        type: 'pie', 
        name: 'Total consumption', 
        data: [{ 
          name: 'Jane', 
          y: 13 
          //color: '#4572A7' // Jane's color 
         }, { 
          name: 'John', 
          y: 23 
          //color: '#AA4643' // John's color 
         }, { 
          name: 'Joe', 
          y: 19 
          //color: '#89A54E' // Joe's color 
         }], 
        center: [30, 80], 
        size: 100, 
        showInLegend: false, 
        dataLabels: { 
         enabled: false 
        } 
       }]; 




      var options = { 
       chart: { 
        renderTo: 'container' 
       }, 
       title: { 
        text: 'Account Managers Leaderboard' 
       }, 
       xAxis: { 
        categories: ['Month on Month', 'Day on Day'] 
       }, 
       tooltip: { 
        formatter: function() { 
         var s; 
         if (this.point.name) { // the pie chart 
          s = ''+ 
           this.point.name +': '+ this.y +' sales'; 
         } else { 
          s = ''+ 
           this.x +': '+ this.y; 
         } 
         return s; 
        } 
       }, 
       labels: { 
        items: [{ 
          html: 'Total proportion of sales <br />this month', 
          style: { 
           left: '40px', 
           top: '-5px', 
           color: 'black' 
          } 
         }] 
       }, 
       series: series 
      }; 

      $(document).ready(function() { 
       var chart; 
       chart = new Highcharts.Chart(options); 
      }); 

     } 



     function getData(){ 
      //alert('ajax'); 

      var receivedData; // store your value here 
      $.ajax({ 
       type: "GET", 
       dataType: "json", 
       url: "API URL", 
       async: false, 
       success: function(data){ 
        alert('data'+data); //works 
        receivedData = data; 
       } 
      }); 

      return receivedData; 
     }; 
+0

[返回AJAX回调回报(http://stackoverflow.com/questions/9041321/return-ajax-callback-return) – xdazz 2012-07-30 09:47:27

+1

可能重复的可能重复[jQuery AJAX:成功返回值](http://stackoverflow.com/questions/9055810/jquery-ajax-return-value-on-success)和[许多其他](http://stackoverflow.com/search?q = jquery + return + value + from + ajax&submit = search)... – 2012-07-30 09:49:23

+0

上述代码将工作的唯一方法是在$ .ajax选项中将async设置为false。尽管这会导致浏览器冻结,直到完成ajax调用 – 2012-07-30 09:51:54

回答

0

的问题是,你从success功能,而不是你getdataaa函数返回。 getdataaa没有返回语句,因此它默认返回undefined。 Return语句是指最近的函数。

success: function(data){ 
    alert(data); // WORKS! and outputs my JSON data 
    ... 
    //Neither of these returns seems to work 
    return jQuery.parseJSON(data); 
    return data; 
} 

这就是你得到的。您可以使用这样的封闭让您的结果:

function getdataaa(){ 
    alert('ajax'); 

    var receivedData; // store your value here 
    $.ajax({ 
     type: "GET", 
     dataType: "json", 
     url: "API URL", 
     async: false, 
     success: function(data){ 

      alert(data); 

      // ... 

      receivedData= data; 
     } 
    }); 

    return receivedData; 
}; 
+0

这将返回undefined - ajax调用不能是异步的。 – Summoner 2012-07-30 10:04:34

+0

每一个,但如果我添加“异步:错误”,这应该做的工作。谢谢 – HeM01 2012-07-30 10:23:18

+0

谢谢,这工作的魅力! – 2012-07-30 11:21:10

1

AJAX调用都是异步的,你必须使用以下方法返回从AJAX调用的响应:

function getdataaa() { 
    return $.ajax({ 
     type: "GET", 
     dataType: "json", 
     url: "API URL", 
     async: false // NOTICE THIS 
    }).responseText; // AND THIS 
}; 

我不确定responseText是否会被解析或解析为JSON,但看看你从哪里得到。

0

相反的:

return jQuery.parseJSON(data); 

OR

return data; 

直接调用createChart功能:

createChart(data)