getJson返回未定义的值而不是Json对象

时间:2017-02-23 16:31:49

标签: javascript jquery json ajax

我正在尝试使用简单的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(); 我得到一些例外,因为会议是undefine 5. GetAllScheduledMeetings()由于某种原因再次被调用,在所有这一切发生之后,在此调用结果中从服务器获得实际值。

有人知道为什么会这样吗?为什么要进行两次调用以及为什么在第一次调用时我没有从服务器获取数据?

2 个答案:

答案 0 :(得分:0)

GetAllScheduledMeetings永远不会返回任何内容(因此,返回undefined)和"是异步"因此,在执行时,使用会议时,变量未定义的概率非常高。 您需要重新编码GetAllScheduledMeetings以传递给您所有"如果阻止"作为回调或使用任何其他方式处理异步代码(例如Promises)。

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
}

答案 1 :(得分:0)

解决方案:

由于默认情况下$.getJSON$.ajax调用是异步的,因此您需要做的是通过向调用定义添加async: false来使它们同步。