Javascript:只调用一次函数

时间:2016-12-06 16:42:34

标签: javascript

这是一段代码:

if (lastPosition == 0) {
  callsomemethod(param);
}

我有这种奇怪的情况,其中我必须调用函数callsomemethod(param);即使if条件不止一次也是如此。换句话说,我想确保函数callsomemethod只被调用一次,即使if语句是多次为真。在if语句中发生了更多的事情,为了简单起见,我刚把它们拿出来。

编辑::感谢所有回复。不幸的是,这个方法都没有工作,因为if语句在函数内部并且该函数被多次调用,所以所有内容都会再次初始化。该功能也在IIFE中。在第一次拍摄中没有让一切清晰的道歉。

提前致谢

5 个答案:

答案 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]>