在下面的代码中,我使用$.getJSON
(从存储库返回)和$.when
检索数据,因为最后一次调用依赖于第一次调用的数据:
var getData =
function () {
var data = { userData: null, userTitles: null, userPage: null };
$.when(repository.getUserDetails().done(f1)),
repository.getUserPolicyTitles().done(f2)
.then(repository.getUserPage().done(f3));
function f1(userData) { data.userData = userData; console.log(data.userData) };
function f2(userTitles) { data.userTitles = userTitles; console.log(data.userTitles) };
function f3(userPage) { data.userPage = userPage; console.log(data.userPage) };
return data;
}
return {
getData: getData
};
大部分工作正常。但是,我想将数据返回给调用模块,但是在数据准备好之前它会返回,就像我想你想的那样。
实现这一目标的最佳方法是什么?
由于
戴维
答案 0 :(得分:2)
您对延迟的使用似乎不正确。这是我的解释。
此外,您需要考虑一旦开始调用异步方法,就无法进行同步返回调用,这就是您正在进行的操作。你需要返回一个承诺,而不是返回数据;那么你提供一个带有数据的回调的承诺
var getData = function () {
var myDeferred = $.Deferred();
var data = { userData: null, userTitles: null, userPage: null };
$.when(repository.getUserDetails().done(f1),
repository.getUserPolicyTitles().done(f2),
repository.getUserPage().done(f3)).then(
function(){ myDeferred.resolve(data); },
function(){ myDeferred.reject.apply(myDeferred, arguments); });
//... f1, f2, f3
return myDeferred.promise();
}
return {
getData: getData
};
然后,当您想要实际使用数据时,您可以
your_library.getData().then(function(data){
// magic goes here
}, function(errors_of_some_sort) {
// error handling magic goes here
});
答案 1 :(得分:0)
使用$ .when时,只能在返回所有AJAX调用后获取数据。例如:
$.when($.getJSON('somewhere'), $.getJSON('somewhere2'))
.done(function(r1, r2){
//set your data object with the responses from the server here
});
所以简短的回答是你无法“返回”从服务器检索到的数据,但是你可以在数据准备就绪时分配回调来使用数据(或设置为模块的某个实体)。 / p>