2011-11-20 177 views
0

我試圖返回從使用JSON jQuery插件(http://code.google.com/p/jquery-json/)功能的JSON對象,但在函數返回的對象之後,就變得不確定。JavaScript函數返回undefined JSON對象(但它不是未定義!)

$(document).ready(function() { 

    var $calendar = $('#calendar'); 

    $calendar.weekCalendar({ 

     ... 

     data : function(start, end, callback) { 
      var datas = getEventData(); 
      alert(datas); // Undefined??? 
     } 
    }); 

如果我返回之前檢查的對象,它被定義。

function getEventData() { 
     var dataString = "minDate="+ minDate/1000 + "&maxDate=" + maxDate/1000; 
     //alert(dataString);return false; 
     $.ajax({ 
       type: "POST", 
       url: "busker_ops.php", 
       data: dataString, 
       dataType: "json", 
       success: function(data) { 
        if(data != null) { 
          var jsonArray = new Array(); 
          var jsonObj = {}; 
          for(var i = data.length - 1; i >= 0; --i) { 

           var o = data[i]; 
           var set_id = o.set_id; 
           var start = o.startOrig; 
           var end = o.endOrig; 
           var title = o.title; 
           var deets = o.deets; 
           jsonObj = 
            { 
             "id":parseInt(set_id), 
             "start":$("#calendar").weekCalendar("formatDate", new Date(start), "c"), 
             "end":$("#calendar").weekCalendar("formatDate", new Date(end), "c"), 
             "title":title, 
             "body":deets 
            }; 
           jsonArray[i] = jsonObj; 
          } 
          alert($.toJSON(jsonArray)); // Defined! 
          return ($.toJSON(jsonArray)); 
        } else { 
        } 
       } 
     }); 
    } 

任何想法,我在這裏失蹤?

+0

哇,我來了很長的路......不敢相信我在與異步鬥爭。哈哈! – Corey

回答

2
function getEventData() { 
    function local() { 
    console.log(42); 
    return 42; 
    } 

    local(); 
} 

您錯過了外部函數返回未定義的事實。這就是爲什麼你的答案沒有定義。

你也在做異步編程錯誤。你想使用回調。大概有100個關於這個確切問題的重複問題。

+0

你非常有幫助!謝謝。實現我的異步錯誤並使用回調! http://stackoverflow.com/questions/2195161/how-to-return-an-array-from-jquery-ajax-success-function-properly – Corey

1

您的getEventData()函數不會返回任何內容。

您正在從異步調用的回調函數返回JSON對象。您對$ .ajax的調用不返回任何內容,它只是開始後臺XMLHttpRequest,然後立即返回。當請求完成時,如果HTTP請求成功,它將調用success函數。成功函數返回到$ .ajax的內部代碼,而不是到您最初稱爲$ .ajax的函數。

+0

杜!謝謝。現在解決這個問題。 – Corey

0

我解決了這個問題,因爲AJAX畢竟是回調。一旦檢索到數據,它將被分配給回調中的全局變量,並使用全局變量(數據)刷新日曆。

$(document).ready(function() { 

    // Declare variables 
    var $calendar = $('#calendar'); 
    datas = ""; 
    set = 0; 

    // Retrieves event data 
    var events = { 
     getEvents : function(callback) { 
      var dataString = "minDate="+ minDate/1000 + "&maxDate=" + maxDate/1000; 
      $.ajax({ 
       type: "POST", 
       url: "busker_ops.php", 
       data: dataString, 
       dataType: "json", 
       success: function(data) { 
        if(data != null) { 
          var jsonArray = new Array(); 
          var jsonObj = {}; 
          for(var i = data.length - 1; i >= 0; --i) { 

           var o = data[i]; 
           var set_id = o.set_id; 
           var start = o.startOrig; 
           var end = o.endOrig; 
           var title = o.title; 
           var deets = o.deets; 
           jsonObj = 
            { 
             "id":parseInt(set_id), 
             "start":$("#calendar").weekCalendar("formatDate", new Date(start), "c"), 
             "end":$("#calendar").weekCalendar("formatDate", new Date(end), "c"), 
             "title":title, 
             "body":deets 
            }; 
           jsonArray[i] = jsonObj; 
          } 
          //alert($.toJSON(jsonArray)); 
          callback.call(this,jsonArray); 
        } else { 
        } 
       } 
     }); 
     } 
    } 

    $calendar.weekCalendar({ 
     data : function(start, end, callback) { 
       if(set == 1) { 
        callback(datas); 
        //alert(datas.events); 
       } 
     } 
    }); 

    // Go get the event data 
    events.getEvents(function(evented) { 
     displayMessage("Retrieving the Lineup."); 
     datas = { 
       options : {}, 
       events : evented 
     }; 
     set = 1; 
     $calendar.weekCalendar("refresh"); 
    }); 

});