Javascript:只调用一次函数

问题描述 投票:0回答:6

这里有一段代码:

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

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

编辑::感谢所有回复。不幸的是,这些方法都不起作用,因为 if 语句在函数内部,并且该函数被多次调用,因此所有内容都被再次初始化。该函数也位于 IIFE 中。抱歉没有在第一枪中把所有事情都说清楚。

提前致谢

javascript
6个回答
7
投票

惯用的方法是使用锁变量,可以选择通过闭包隐藏。最简单的例子是:

var done = false;
function callOnce(lastPosition) {
  if (lastPosition == 0 && !done) {
    done = true;
    callSomeMethod(lastPosition);
  }
}

produce 只能调用一次的函数,您可以使用闭包和包装:

function wrapOnce(fn) {
  var done = false;
  return function (...args) {
    if (!done) {
      done = true;
      return fn.apply(this, args);
    }
  }
}

...args
语法在旧版浏览器中可能不起作用,应替换为代码以验证
arguments
并将其传递下来,为简洁起见,我省略了它)

这是像 lodash 的 once 这样的助手的基础。

由于 JS 只允许单个线程访问变量,这本质上是线程安全的(如它适用),并且如果多个回调尝试使用

once
化方法也不会中断。


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
  };
})();

0
投票

声明一个全局变量 var ran=false,在 callsomethingmethod 中将其设置为 true,并扩展你的 if :

if(lastposition==0 && ran==false)
{
callsomemethod(param);
}

0
投票

您可以有一个名为

called
的布尔值,当您第一次调用该方法时将其设置为 true:

var called = false;
if (lastPosition == 0) {
  if(!called){
    callsomemethod(param);
    called = true;
  }
}

0
投票

这是另一种方式,但与之前的回复类似。您可以使用 Function 原型来添加一次调用行为。在下面的代码中,只有第一次调用才会打印结果。

function callSomeMethod(param){
  console.log('called...'+param);
};

Function.prototype.onlyOnce = function(param){
  if(!this.wasCalled && this == callSomeMethod){
    this(param);
    this.wasCalled = true;
  }
};


function outerMethod(){
  callSomeMethod.onlyOnce('foo');
  callSomeMethod.onlyOnce('bar');
}

outerMethod();

0
投票

在我的

react native
中,有一个函数(函数名是
submitData()
)连续
runs every 10 seconds
。我想要我的 submitData() 函数中的另一个函数(函数名称是
callOnlyOnce()
),但在这里我 callOnlyOnce() 函数只在第一次运行。

所以我用了

let myResult;

  var callOnlyOnce =(function(){
    return function(){
      if (!opop){
        // console.log(`checking value`,executed)
        opop = true
        // console.log(`checking new log value`,executed)
        const x =1
        const y =3
        myResult = x+y
        console.log(`Log inside the function`,myResult,opop)
      }
    }
  })()  
  callOnlyOnce()

opop 定义在 main 函数之上

import * as React from 'react';
let opop = false
© www.soinside.com 2019 - 2024. All rights reserved.