这里有一段代码:
if (lastPosition == 0) {
callsomemethod(param);
}
我有这种奇怪的情况,我必须调用函数 callsomemethod(param);即使 if 条件不止一次为真。换句话说,我想确保函数 callsomemethod 只被调用一次,即使 if 语句不止一次为真。在 if 语句中发生了更多的事情,为了简单起见,我只是把它们去掉了。
编辑::感谢所有回复。不幸的是,这些方法都不起作用,因为 if 语句在函数内部,并且该函数被多次调用,因此所有内容都被再次初始化。该函数也位于 IIFE 中。抱歉没有在第一枪中把所有事情都说清楚。
提前致谢
惯用的方法是使用锁变量,可以选择通过闭包隐藏。最简单的例子是:
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
化方法也不会中断。
添加一个标志来跟踪之前是否调用过该函数:
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
};
})();
声明一个全局变量 var ran=false,在 callsomethingmethod 中将其设置为 true,并扩展你的 if :
if(lastposition==0 && ran==false)
{
callsomemethod(param);
}
您可以有一个名为
called
的布尔值,当您第一次调用该方法时将其设置为 true:
var called = false;
if (lastPosition == 0) {
if(!called){
callsomemethod(param);
called = true;
}
}
这是另一种方式,但与之前的回复类似。您可以使用 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();
在我的
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