2017-02-23 104 views
0

我試圖使用簡單的getJson調用從服務器獲取Json對象。getJson返回未定義的值而不是Json對象

在服務器端一切看起來不錯。 JSON是創建並返回:

enter image description here

但在前端我的對象不是從服務器映射到返回的JSON。它在第一次調用時是未定義的,並且該值通過getJson再返回一次,並返回實際對象。

這是我的代碼:

btnSaveNewMeeting.onclick = function() { 
    var vm = { 
     'Title': $('#eventTitle').val(), 
     'StartAt': $('#startdatepicker').val() + ' ' + $('#starttimepicker').val(), 
     'EndAt': $('#enddatepicker').val() + ' ' + $('#endtimepicker').val() 
    } 

    var meetings = GetAllScheduledMeetings(); 

    if (CheckIfMeetingsAreOverlapping(vm.StartAt, vm.EndAt, meetings)) { 
     addNewMeetingModal.style.display = "none"; 

     $.ajax({ 
      type: 'POST', 
      url: "/Meeting/Create", 
      data: vm, 
      success: function() { 
       $('#calendar').fullCalendar('refetchEvents'); 
      } 
     }); 

     ClearPopupFormValues(); 
    } 
} 

所以我想從GetAllScheduledMeetings();獲得價值,並把它放在meetings對象。

var meetings = GetAllScheduledMeetings(); 

function GetAllScheduledMeetings() { 
    $.getJSON("/Meeting/GetAllScheduledMeetings", function (result) { 
     return result; 
    }); 
} 

因此GetAllScheduledMeetings()應該只調用服務器並返回結果。但那並沒有發生。

當我在瀏覽器的控制檯中進行調試時發生的事情是這樣的: 1.在按鈕單擊GetAllScheduledMeetings()被調用。 2. getJson調用服務器,json對象在那裏創建並返回。 3.它可以追溯到前端,但跳過整個return result;部分和返回undefine價值var meeting = GetAllScheduledMeetings(); 4.我得到的少數例外,因爲會議是undefine 得到再次呼籲出於某種原因,這一切已經發生之後在這個調用結果中從服務器獲得真正的值。

有人知道爲什麼會發生這種情況嗎?爲什麼要打兩個電話,爲什麼在第一次打電話時我沒有從服務器獲取數據?

回答

0

GetAllScheduledMeetings從不會返回任何東西(所以返回undefined)並且「是異步的」,所以在執行時使用會議時,變量未定義的概率非常高。 您需要重新編碼GetAllScheduledMeetings來傳遞所有「if block」作爲回調或使用任何其他方式來處理異步代碼(例如Promise)。

function GetAllScheduledMeetings() { 
    $.getJSON("/Meeting/GetAllScheduledMeetings", function (result) { // This anonymous function is called asynchronously and returns result *in the blue* 
     return result; 
    }); 
    // GetAllScheduledMeetings doesn't specify a return value so it's retVal is undefined 
} 
+0

哦,我明白了......但如何解決這個問題。我試圖讓一些變量之外的getJSON,但結果無論如何未定義在第一遍...什麼是得到json對象與getJSON並返回它的最佳方式是什麼? @ Booster2ooo –

0

SOLUTION:

由於$.getJSON$.ajax調用都是異步的,所有你需要做的就是讓他們同步加入:async: false調用的定義。

+0

選擇此答案爲已接受(「downvote」選項下的綠色勾號)以顯示問題已解決。 – burtek

相關問題