--- EDITED ---由于我的无知,这实际上和其他AJAX类型的问题一样......需要进入正确的心态。为了后人的缘故离开这里,也许可以帮助其他人在发布之前再看看回调。
所以我想在前面说我认为这不是标准“如何从ajax调用中返回值”问题,人们不等待异步调用完。我认为这是对Javascript模块模式的可变范围误解,因此任何指导都将受到赞赏。
我正在关注this SO post构建我的ajax调用,所以我在调用完成后使用延迟对象来处理我的数据。还有一些关于Javascript模块模式的教程,如this和this。从外部模块中的私有模块中返回值似乎相当简单 - 但是,我总是将myObj.roots()视为未定义。即使我用断点检查它被定义为X值的数组。我错过了什么简单的事 - 任何提示?谢谢!对不起,一个简单的问题,我是JS模块模式的新手,并试图建立自己的库......
我的JS代码:
var myObj = (function(window,document,$,undefined){
var _baseUri = 'http://example.com/',
_serviceUri = 'services/',
_bankId = '1234',
_myUri = _baseUri + _serviceUri + 'objectivebanks/' + _bankId,
_roots = [];
function myAjax(requestURL) {
return $.ajax({
type: 'GET',
url: requestURL,
dataType: 'json',
async: true
});
}
var getRoots = function() {
var _url = _myUri + '/objectives/roots';
_roots = [];
myAjax(_url).done(function(data) {
$.each(data, function(index, nugget) {
_roots.push(nugget);
});
return _roots;
}).fail(function(xhr, textStatus, thrownError) {
console.log(thrownError.message);
});
}
return {
roots: getRoots
};
})(this,document,jQuery);
我的错误(来自Chrome的开发者工具'控制台):
myObj.roots()
undefined
答案 0 :(得分:4)
您的“getRoots”功能不会返回任何内容。使用$ .ajax(successCallback)或$ .ajax.done()模式是一回事。你没有推迟任何事情。 没有回调,事件或承诺,你无法做到这一点。 回调和事件基本相同,只有后者允许更好的架构解耦(高度争议的事实)。 Promise意味着您可以编写var x = getRoots()并且x将是未定义的,直到浏览器从服务器返回响应。您的申请必须考虑到这一点。因此,要么开始编写异步模式(回调,事件),要么设计应用程序优雅地处理空值/未定义值。
使用回调:
function getStuff(callback) {
$.ajax(...).done(function(data) {
// maybe process data?
callback(data);
});
}
getStuff(function(data) {
// this is where I can use data
});
这样你就可以在一个单独的模块中编写你的getStuff方法,比如说“DataService”,这样就不会污染MVC逻辑。