Javascript 如何在JS类中对函数进行排队,直到基本ajax请求完成

Javascript 如何在JS类中对函数进行排队,直到基本ajax请求完成,javascript,ajax,Javascript,Ajax,我正在构建一个javascript对象,它主要应该在处理任何其他函数之前发送一个身份验证ajax请求 例如: hello={ say:function(txt){ alert(txt); }, auth:function(){ ... ajax ... } } hello.say("hello world!"); 在成功获取身份验证ajax请求之前,不应触发警报。这就像在初始化完成之前将任何函数排队到对象 另外,当页面完全加载时,应自动激发身份验证 编辑 尝试使用SLaks方法: fun

我正在构建一个javascript对象,它主要应该在处理任何其他函数之前发送一个身份验证ajax请求

例如:

hello={
say:function(txt){
alert(txt);
},
auth:function(){
... ajax ...
}
}

hello.say("hello world!");
在成功获取身份验证ajax请求之前,不应触发警报。这就像在初始化完成之前将任何函数排队到对象

另外,当页面完全加载时,应自动激发身份验证

  • 编辑
尝试使用SLaks方法:

functionQueue = [];
function exec(func) {
    if (functionQueue){
        functionQueue.push(func);
    }else{ 
        func();
    }
}


hello={
say:function(txt){
alert(txt);
},
auth:function(){
ajax.post("http://www.hello.com",function(resp){
        var queue = functionQueue;
        functionQueue = false;    //Prevent re-entrancy
        for (var i = 0; i < queue.length; i++){
            queue[i]();
        }
});
}
}

function start(){
hello.auth();
}

window.addEventListener("load", start, false);
hello.say("hello world!");
functionQueue=[];
函数执行器(func){
if(函数队列){
functionQueue.push(func);
}否则{
func();
}
}
你好={
say:函数(txt){
警报(txt);
},
auth:function(){
ajax.post(“http://www.hello.com,功能(resp){
var queue=functionQueue;
functionQueue=false;//防止重新进入
对于(变量i=0;i
非常感谢你的帮助


谢谢

创建一个要执行的函数数组,如果请求尚未完成,则将每个函数推送到该数组中,然后在AJAX请求完成时遍历执行函数的数组

例如:

var functionQueue = [];
function exec(func) {
    if (functionQueue)
        functionQueue.push(func);
    else    //AJAX request already finished
        func();
}
$.ajax({
    ...
    success: function(...) {
        ...
        var queue = functionQueue;
        functionQueue = false;    //Prevent re-entrancy
        for (var i = 0; i < queue.length; i++)
            queue[i]();
    }
});
您可能希望将队列放入对象中:

var hello = {
    functionQueue: [],
    exec: function(func) {
        if (this.functionQueue){
            this.functionQueue.push(func);
        } else {
            func.call(this);
        }
    },
    say: function(txt){
        this.exec(function() {
            alert(txt);   //this still works
        });
    },
    auth: function(){
        var me = this;
        $.get("/echo/json/", function(resp){
            alert('AJAX finished!');

            var queue = me.functionQueue;
            functionQueue = false;    //Prevent re-entrancy
            for (var i = 0; i < queue.length; i++){
                queue[i].call(me);
            }
        });
    }
};


hello.say("hello world!");
hello.auth();
var hello={
函数队列:[],
执行:函数(func){
if(this.functionQueue){
this.functionQueue.push(func);
}否则{
函数调用(本);
}
},
say:函数(txt){
this.exec(函数(){
警报(txt);//这仍然有效
});
},
auth:function(){
var me=这个;
$.get(“/echo/json/”,函数(resp){
警报('AJAX finished!');
var queue=me.functionQueue;
functionQueue=false;//防止重新进入
对于(变量i=0;i
听起来你需要使用callback你实际上没有在任何地方调用
exec
。@SLaks谢谢你的回答,但是我不知道如何在对象中实现exec(),你能根据我提供的例子给出一个例子吗?@David:
exec(someFunction)
exec(function(){…})
。它说functionQueue未定义,因为这是一个对象,它无法获取全局变量,我已经删除了“变量”,但仍然无法工作,如果您能根据我的对象结构键入一个示例,我将不胜感激。@David:我不知道您在说什么。如果你不理解我的代码,你应该学习更多的Javascript;没什么特别的。对不起,这不是傲慢。我的代码只是一个数组和一个使用它的函数。您可能在
这方面遇到问题
;请让我看看你的尝试。
var hello = {
    functionQueue: [],
    exec: function(func) {
        if (this.functionQueue){
            this.functionQueue.push(func);
        } else {
            func.call(this);
        }
    },
    say: function(txt){
        this.exec(function() {
            alert(txt);   //this still works
        });
    },
    auth: function(){
        var me = this;
        $.get("/echo/json/", function(resp){
            alert('AJAX finished!');

            var queue = me.functionQueue;
            functionQueue = false;    //Prevent re-entrancy
            for (var i = 0; i < queue.length; i++){
                queue[i].call(me);
            }
        });
    }
};


hello.say("hello world!");
hello.auth();