ajax调用不会从外部JS文件返回数据

ajax call doesnt return the data from external JS file

本文关键字:文件 返回 数据 JS 从外部 调用 ajax      更新时间:2023-09-26

我正在尝试用JavaScript实现Repository模式。我有ViewModel,当我调用它的initialize方法时,我想用数据初始化它。除了我无法从AJAX调用中返回数据之外,一切似乎都在原地踏步。我可以看到数据是从ajax调用返回的,但当我试图在SomeViewModel的done函数中捕获数据时,它是null。

有人能告诉我哪里出了问题吗?

p.S:请注意,我没有进行异步调用,因此调用链得到了正确维护。

这就是我的存储库的样子:

function SomeRepository(){
    this.LoadSomeData = function loadData()
    {
        $.ajax({
            type: "POST",
            url: "someUrl",
            cache: true,
            async: false,
            contentType: "application/json; charset=utf-8",
            data: "{}",
            dataType: "json",
            //success: handleHtml,
            success: function(data) {
                alert('data received');
                return data; 
            },
            error: ajaxFailed
        });

        function ajaxFailed(xmlRequest) {
                alert(xmlRequest.status + ' 'n'r ' + 
                xmlRequest.statusText + ''n'r' + 
                xmlRequest.responseText);
        }
    }


};

这就是我的ViewModel的样子:

function SomeViewModel(repository){   
    var self = this;
    var def = $.Deferred();
    this.initialize = function () {
    var def = $.Deferred();
    $.when(repository.LoadSomeData())
    .done(function (data) {
        def.resolve();
    });
    return def;
  };
}

这就是我从aspx页面调用的方式:

var viewModel = new SomeViewModel(new SomeRepository());
viewModel.initialize().done(alert('viewmodel initialized'));
alert(viewModel.someProperty);

我已经成功地使用了一个辅助变量来放置ajax结果,当ajax调用在函数内部时(仅在ajax为async=false时有效),并且我需要函数返回ajax结果。我不知道这是否是最好的解决方案。

function ajaxFunction(){
    var result='';
    $.ajax({
        type: "POST",
        url: "someUrl",
        cache: true,
        async: false,
        contentType: "application/json; charset=utf-8",
        data: "{}",
        dataType: "json",
        //success: handleHtml,
        success: function(data) {
            alert('data received');
            result=data; 
        },
        error: ajaxFailed
    });
    return result;
 }

它是同步的并不重要(尽管它确实不应该是同步的)。从ajax回调内部返回值将不会导致从包含函数返回值。

无论如何,使用异步ajax通常是一个更好的想法,但这将迫使您创建一个API,允许其客户端传入处理程序,以便在ajax请求完成时调用。为此,您需要为"LoadSomeData"函数提供一个参数。调用方会传入一个函数,您的ajax"成功"处理程序会将结果(或结果的一些转换;取决于您正在做什么)传递给回调。这与ajax调用本身中使用的回调是相同的想法。