来自自定义jQuery AJAX函数的Javascript回调

Fre*_*red 1 javascript ajax jquery json callback

我有这个jQuery代码

(function () {
    function load_page (pagename) {
        $.ajax({
            url: "/backend/index.php/frontend/pull_page/",
            type: "POST",
            data: {page: pagename},
            success: function (json) {
                var parsed = $.parseJSON(json);
                console.log(parsed);
                return parsed;
            },
            error: function (error) {
                $('#content').html('Sorry, there was an error: <br>' + error);
                return false;
            }
        });
    }
    ...
    var json = load_page(page);
    console.log(json);
    if (json == false) {
        $('body').fadeIn();
    } else {
        document.title = json.pagename + ' | The Other Half | freddum.com';
        $("#content").html(json.content);
        $('#header-navigation-ul a:Contains('+page+')').addClass('nav-selected');
        $('body').fadeIn();
    }
})();
Run Code Online (Sandbox Code Playgroud)

而且,猜猜看,它不起作用.AJAX请求触发正常,服务器返回有效的JSON但console.log(json);返回undefined时js崩溃json.pagename.第一个console.log(parsed)也返回好的数据,所以它只是一个问题return(我认为).

我知道我抓着吸管,如果这样做会非常有效,但事实并非如此.说实话,我不知道如何为这种情况编写回调函数.

编辑:这是我现在更新的代码,也不起作用.

function load_page (pagename, callback) {
    $.ajax({
        url: "/backend/index.php/frontend/pull_page/",
        type: "POST",
        data: {page: pagename},
        success: function (json) {
            callback(json);
        },
        error: function (error) {
            $('#content').html('Sorry, there was an error: <br>' + error);
            var json = false;
            callback(json);
        }
    });
}
(function () {
    $('body').hide();
    var page = window.location.hash.slice(1);
    if (page == "") page = 'home';
    load_page(page, function(json) {
        var parsed = $.parseJSON(json);
        console.log(parsed);
        if (json.pagename == "" || json.pagename == null) {
            document.title = 'Page Not Found | The Other Half | freddum.com';
            $('body').fadeIn();
        } else {
            document.title = parsed.pagename + ' | The Other Half | freddum.com';
            $("#content").html(parsed.content);
            $('#header-navigation-ul a:Contains('+page+')').addClass('nav-selected');
            $('body').fadeIn();
        }    
    });

})();
Run Code Online (Sandbox Code Playgroud)

load_page进入全局命名空间'因为我需要它在那里.在console.log(parsed)什么似乎回报是一个有效的JSON对象,但console.log(parsed.content)收益率undefined.#content也没有被设定.有任何想法吗?我很乐意做任何测试.

任何帮助是极大的赞赏!

Jac*_*kin 8

因为Ajax请求是异步的,所以$.ajax函数调用之后的代码仍会执行,无论请求是否完成,因此您应该接受回调作为参数load_page,在请求完成时调用该参数:

function load_page (pagename, callback) {
    $.ajax({
        url: "/backend/index.php/frontend/pull_page/",
        type: "POST",
        data: {page: pagename},
        success: function (json) {
            var parsed = $.parseJSON(json);
            console.log(parsed);
            callback(parsed); //bingo
        },
        error: function (error) {
            $('#content').html('Sorry, there was an error: <br>' + error);
        }
    });
}

load_page(page, function(json) {
   console.log(json);
   if (json == false) {
      $('body').fadeIn();
   } else {
      document.title = json.pagename + ' | The Other Half | freddum.com';
      $("#content").html(json.content);
      $('#header-navigation-ul a:Contains('+page+')').addClass('nav-selected');
      $('body').fadeIn();
   }
});
Run Code Online (Sandbox Code Playgroud)