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

时间:2012-03-22 15:02:21

标签: javascript jquery

我正在尝试在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);

2 个答案:

答案 0 :(得分:1)

我已成功使用辅助变量来放置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;
 }

答案 1 :(得分:0)

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

无论如何,使用异步ajax通常是一个更好的主意,但这会强制您创建一个API,允许其客户端在ajax请求完成时传入处理程序。为此,您需要为“LoadSomeData”函数指定一个参数。调用者会传入一个函数,而你的ajax“success”处理程序会将结果(或结果的某些转换;取决于你正在做什么)传递给该回调。它与ajax调用本身中使用的回调相同。