我正在尝试在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);
答案 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调用本身中使用的回调相同。