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