这是一段代码:
if (lastPosition == 0) {
callsomemethod(param);
}
我有这种奇怪的情况,其中我必须调用函数callsomemethod(param);即使if条件不止一次也是如此。换句话说,我想确保函数callsomemethod只被调用一次,即使if语句是多次为真。在if语句中发生了更多的事情,为了简单起见,我刚把它们拿出来。
编辑::感谢所有回复。不幸的是,这个方法都没有工作,因为if语句在函数内部并且该函数被多次调用,所以所有内容都会再次初始化。该功能也在IIFE中。在第一次拍摄中没有让一切清晰的道歉。
提前致谢
答案 0 :(得分:5)
执行此操作的惯用方法是使用锁定变量,可选择通过闭包隐藏。最简单的例子是:
var done = false;
function callOnce(lastPosition) {
if (lastPosition == 0 && !done) {
done = true;
callSomeMethod(lastPosition);
}
}
要生成只能被调用一次的函数,你可以使用闭包并包装:
function wrapOnce(fn) {
var done = false;
return function (...args) {
if (!done) {
done = true;
return fn.apply(this, args);
}
}
}
(...args
语法可能无法在较旧的浏览器中使用,应替换为代码以验证arguments
并将其传递下去,为简洁起见,我已将其省略了。
这是lodash's once等助手的基础。
由于JS只允许单个线程访问变量,因此这本质上是线程安全的(例如它适用),并且如果多个回调尝试使用once
- ified方法,则不会中断。
答案 1 :(得分:2)
添加一个标志以跟踪先前是否调用过该函数:
var wasCalled = false;
// ...
if (lastPosition == 0) {
if(!wasCalled) {
wasCalled = true;
callsomemethod(param);
}
}
更高级,利用闭包来完成整个事情:
var callsomemethod = (function(){
var wasCalled = false;
return function(param){
if(wasCalled){
return;
}
else {
wasCalled = true;
}
// callsomemethod()'s inner code goes here
};
})();
答案 2 :(得分:0)
声明一个全局变量var ran = false,在callsomethingmethod中将其设置为true,并扩展你的if:
user_omniauth_callback GET|POST /users/auth/:action/callback(.:format) users/omniauth_callbacks#(?-mix:saml)
答案 3 :(得分:0)
你可以有一个名为called
的布尔值,当你第一次调用方法时,你设置为true:
var called = false;
if (lastPosition == 0) {
if(!called){
callsomemethod(param);
called = true;
}
}
答案 4 :(得分:0)
这是另一种类似于先前回复的方式。您可以使用 Function 原型来添加一次性呼叫行为。在下面的代码中,只有第一次调用才会打印结果。
@model IEnumberable<[model name here]>