这是一段代码:
if (lastPosition == 0) {
callsomemethod(param);
}
Run Code Online (Sandbox Code Playgroud)
我有这种奇怪的情况,其中我必须调用函数callsomemethod(param); 即使if条件不止一次也是如此.换句话说,我想确保函数callsomemethod只被调用一次,即使if语句是多次为真.if语句中发生了更多的事情,为了简单起见,我刚把它们拿出来.
编辑::感谢所有的回复.不幸的是,这个方法都没有工作,因为if语句在函数内部,并且该函数被多次调用,所以一切都会再次初始化.该功能也在IIFE中.在第一次拍摄中没有让一切清晰的道歉.
提前致谢
执行此操作的惯用方法是使用锁定变量,可选择通过闭包隐藏.最简单的例子是:
var done = false;
function callOnce(lastPosition) {
if (lastPosition == 0 && !done) {
done = true;
callSomeMethod(lastPosition);
}
}
Run Code Online (Sandbox Code Playgroud)
要生成只能调用一次的函数,可以使用闭包并包装:
function wrapOnce(fn) {
var done = false;
return function (...args) {
if (!done) {
done = true;
return fn.apply(this, args);
}
}
}
Run Code Online (Sandbox Code Playgroud)
(...args语法可能在旧浏览器中不起作用,应该用代码替换以验证arguments并传递它,为简洁起见我省略了)
这是像lodash一样的助手的基础.
由于JS只允许单个线程访问变量,因此这本身就是线程安全的(例如它适用),并且如果多个回调尝试使用once-ified方法,则不会中断.
| 归档时间: |
|
| 查看次数: |
7963 次 |
| 最近记录: |