Javascript调用函数,在函数返回之前不要再次调用它
我有一个按钮,当点击时调用一个函数——这个函数执行一些异步Ajax,并在Ajax返回时向messagebox发出警报。我不希望用户多次单击该按钮-如果他在Ajax未返回时单击该按钮,则应发出错误消息警报 我知道使用全局布尔变量可以很容易地做到这一点(初始设置为true,进行ajax调用并将其设置为false-当ajax返回时再次将其设置为true-当用户单击按钮时检查全局是否为false)。同样,如果我使用另一个包含函数和布尔值的全局对象来代替窗口/全局对象,也可以这样做Javascript调用函数,在函数返回之前不要再次调用它,javascript,closures,Javascript,Closures,我有一个按钮,当点击时调用一个函数——这个函数执行一些异步Ajax,并在Ajax返回时向messagebox发出警报。我不希望用户多次单击该按钮-如果他在Ajax未返回时单击该按钮,则应发出错误消息警报 我知道使用全局布尔变量可以很容易地做到这一点(初始设置为true,进行ajax调用并将其设置为false-当ajax返回时再次将其设置为true-当用户单击按钮时检查全局是否为false)。同样,如果我使用另一个包含函数和布尔值的全局对象来代替窗口/全局对象,也可以这样做 然而,我不太喜欢上面的
然而,我不太喜欢上面的方法——我认为它们有点老派Javascript。我想知道是否有一种更优雅的方法可以做到这一点,例如使用JS闭包 使用此方法,变量将不会泄漏到全局范围。无法从函数外部操纵此变量:
var foo = (function(){
var pending = false;
return function foo(){
if(pending) return;
pending = true;
//...Code
//When finished:
pending = false;
}
})()
其他人可能建议设置函数的属性,但此属性可以从外部轻松调整,这是不可取的。使用此方法,您的变量不会泄漏到全局范围。无法从函数外部操纵此变量:
var foo = (function(){
var pending = false;
return function foo(){
if(pending) return;
pending = true;
//...Code
//When finished:
pending = false;
}
})()
var callback = (function()
{
var executing = false;
function yourfunc()
{
if(executing) return; // exit if pending
executing = true;
// here send the request
// edit: when the ajax response has returned
xxxx.onreadystatechange....{
// do what you need to do with ajax data
executing = false;
};
}
return yourfunc;
})();
callback();
其他人可能建议设置函数的属性,但此属性可以从外部轻松调整,这是不可取的。匿名函数的形式如下
var callback = (function()
{
var executing = false;
function yourfunc()
{
if(executing) return; // exit if pending
executing = true;
// here send the request
// edit: when the ajax response has returned
xxxx.onreadystatechange....{
// do what you need to do with ajax data
executing = false;
};
}
return yourfunc;
})();
callback();
(function(){}))()
最后一个()提供匿名函数的参数
在上面的示例脚本中(由wes编写)返回错误,因为回调函数不是已定义的函数。Rob使用闭包的方法听起来不错
干杯。。Sree匿名函数的形式为
(function(){}))()
最后一个()提供匿名函数的参数
在上面的示例脚本中(由wes编写)返回错误,因为回调函数不是已定义的函数。Rob使用闭包的方法听起来不错
干杯。。Sree为什么不在单击时禁用按钮?当响应返回时,启用它。同意-这是另一种方式,但我更喜欢更优雅的方式:)为什么不干脆禁用按钮并告诉用户它正在处理请求?这样,用户将知道后台正在发生某些事情,而您不需要全局变量或闭包。为什么首先要强迫用户再次单击按钮。记住-始终向用户提供反馈。干杯。哇,我不是唯一一个这么想的人。我讨厌移动网络。没有更新=(为什么不在单击时禁用按钮?当响应返回时,重新启用它。同意-这是另一种方式,但我更喜欢更优雅的方式:)为什么不干脆禁用按钮并告诉用户它正在处理请求?这样,用户将知道后台正在发生某些事情,而您不需要全局变量或闭包。为什么首先要强迫用户再次单击按钮。记住-始终向用户提供反馈。干杯。哇,我不是唯一一个这么想的人。我讨厌移动网络。没有更新=(函数foo()不应该被调用吗?我只定义了
function foo
。你可以随时调用foo()
,但一次只能运行一个函数。我只为你草拟了一个工作概念,可以根据你的项目对其进行调整。因此有了虚拟名称(foo
)。不应该是function foo()是否在某个地方调用?我只定义了函数foo
。您可以随时调用foo()
,但一次只能运行一个函数。我只为您草拟了一个工作概念,可以根据您的项目对其进行调整。因此使用了虚拟名称(foo
)。不起作用,您没有将yourfunc
分配给callback
,而是将yourfunc
分配给私有变量cb
。不起作用,您没有将yourfunc
分配给callback
,而是将yourfunc
分配给私有变量cb
。