Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ajax调用不会从外部JS文件返回数据_Javascript_Jquery - Fatal编程技术网

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

Javascript ajax调用不会从外部JS文件返回数据,javascript,jquery,Javascript,Jquery,我正在尝试用JavaScript实现存储库模式。我有一个ViewModel,我想在调用它的initialize方法时用数据初始化它。除了我无法从AJAX调用中返回数据之外,一切似乎都不顺利。我可以看到数据是从ajax调用返回的,但是当我试图在SomeViewModel的done函数中捕获数据时,它是空的 有人能告诉我哪里出了问题吗 请注意,我没有进行异步调用,因此调用链得到了正确维护 这就是我的存储库的外观: function SomeRepository(){ this.LoadSom

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

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

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

这就是我的存储库的外观:

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);
        }

    }




};
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;
  };

}
以下是我的ViewModel的外观:

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);
        }

    }




};
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通常是一个更好的主意,但这将迫使您创建一个API,允许其客户端在ajax请求完成时传入要调用的处理程序。为此,您需要为“LoadSomeData”函数提供一个参数。调用方将传入一个函数,您的ajax“成功”处理程序将结果(或结果的某些转换;取决于您正在做什么)传递给该回调。这与ajax调用本身中使用的回调的想法相同。

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

如果是这样的话,有没有关于如何使其工作以便UI加载数据的建议?请检查@diegoe的答案这确实有效,但总体而言,同步ajax并不是一个超级好的主意。谢谢你的回答。我的问题有点不同,但你的回答有道理。我会接受它,因为这是从ajax请求返回数据的一种方法。