我是javascript中模块模式和闭包的新手。我正在尝试创建一个获取JSON数据的模块,以便我可以在我的网页上显示它。
var EmailLogs = (function(){
var emailLogs = [];
var config = {};
function init(options){
for(var prop in options) {
if(options.hasOwnProperty(prop)){
config[prop] = options[prop];
}
}
setEmailLogs();
}
function setEmailLogs(){
$.ajax({
type: "POST",
headers : { "cache-control": "no-cache" },
url: "../../ajax/adminGetEmailLogs.php",
data: {options: JSON.stringify(config)},
dataType: 'json',
success: function(values){
if(values.success)
{
emailLogs = values.emailLogs;
}
}
});
}
function getEmailLogs(){
return emailLogs;
}
return{
init: init,
getEmailLogs: getEmailLogs,
}
})();
var options = {
sData : [
'email_id'
],
filters : {
user_id : 44860,
}
}
EmailLogs.init(options);
console.log(EmailLogs.getEmailLogs());
我试图在运行init时运行ajax调用。然后我想要显示emailLogs变量。我推测是因为我的ajax正在运行异步,这就是为什么我之后无法获取变量的原因。在运行getEmailLogs()之前,如何确保setEmailLogs()已运行。
答案 0 :(得分:1)
$.ajax()
实现Promise接口并返回Deferred对象see the jQuery docs
jQuery 1.5中$ .ajax()返回的jqXHR对象实现了Promise接口,为它们提供了Promise的所有属性,方法和行为(有关详细信息,请参阅Deferred对象)。
这意味着您可以使用promise接口确保在$.ajax()
完成后运行所需的方法。
将代码修改为使用promise接口的东西。基本上$.ajax()
会向您返回它将被执行的承诺。然后,一旦满足承诺,您就可以将下一个方法链接起来执行。你经常会看到这样的模式链接多个promises(在伪代码中):
doAjaxRequest()
.then(doSomethingElse)
.then(doAnotherSomethingElse)
通过这种方式,您可以编写相当干净的异步代码,以避免相互调用大量回调。
The documentation for Q promises有一些很好的例子可以解释承诺的工作方式。
我修改了您的代码段以使用promises:
var EmailLogs = (function(){
var emailLogs = [];
var config = {};
function init(options){
for(var prop in options) {
if(options.hasOwnProperty(prop)){
config[prop] = options[prop];
}
}
setEmailLogs().done(function(values) {
if(values.success)
{
console.log(values.emailLogs)
}
});
}
function setEmailLogs(){
return $.ajax({
type: "POST",
headers : { "cache-control": "no-cache" },
url: "../../ajax/adminGetEmailLogs.php",
data: {options: JSON.stringify(config)},
dataType: 'json'
});
}
return{
init: init,
getEmailLogs: getEmailLogs,
}
})();
var options = {
sData : [
'email_id'
],
filters : {
user_id : 44860,
}
}
EmailLogs.init(options);