检查下面的代码。我两次调用once()
函数,而console.log()
运行一次。但是,在运行脚本之后,此once()
函数将不会再次运行,直到刷新HTML页面。现在,您能告诉我如何将该函数设置为吗?我将始终调用该函数两次,并且它将仅在第一次运行该函数,并且它将继续运行而无需刷新html页面。有想法吗?
JS代码:
var once = function() {
if(once.done) return;
console.log('Doing this once!');
once.done = true;
};
once(); once();
答案 0 :(得分:1)
您使用相同的功能。如果您将完成设置为true
,则不会再执行它。因此,它完全符合您的编程要求。第一个if是停止下一个执行。
var once = function() {
if(once.done) return;
console.log('Doing this once!');
once.done = true;
};
// executed
once();
once.done = false;
// executed
once();
// not executed
once();
首先,如果您将完成设置为false
,它将输出第二个结果。
答案 1 :(得分:1)
由于这种情况,您无法两次调用此功能,然后将其设置为true
。 当前,此功能按预期运行。
要使其正常工作,您需要设置once.done= false
,然后再次调用函数。
下面是工作代码:
var once = function() {
if (once.done) return;
console.log('Doing this once!');
once.done = true;
};
once();
once.done = false;
once();
答案 2 :(得分:1)
或者您可以将option作为参数传递,如下面的示例所示
var once = function(retry) {
if (once.done && !retry) return;
console.log('Doing this once!');
once.done = true;
};
once();
一次(true);
答案 3 :(得分:1)
对于每次使用,您正在使用的状态都必须是新的。因此,如果您在函数中创建该函数,然后将其用作回调,则它将在创建该函数的每次运行中都执行一次,但是,如果您全局定义了该函数,则每次重载将只工作一次。您决定。我使用下划线来执行此操作,因此不必:
function doSomething(fn, str) {
const once = _.once(fn);
once(str);
once(str);
}
doSomething(console.log, 'Hello');
doSomething(console.log, 'World');
const add = _.once(() => (console.log('adding!'),5 + 5));
console.log(add());
console.log(add());
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.9.1/underscore-min.js"></script>
所以发生的事情是,下划线会缓存第一次运行的结果,并在连续调用时返回结果。因此,如果您需要使用_.once
的结果,则可以使用。