双重调用的javascript函数,但只能运行一次

时间:2018-08-11 13:48:27

标签: javascript

检查下面的代码。我两次调用once()函数,而console.log()运行一次。但是,在运行脚本之后,此once()函数将不会再次运行,直到刷新HTML页面。现在,您能告诉我如何将该函数设置为吗?我将始终调用该函数两次,并且它将仅在第一次运行该函数,并且它将继续运行而无需刷新html页面。有想法吗?

JS代码:

var once = function() {
    if(once.done) return;
    console.log('Doing this once!');
    once.done = true;
};

once(); once();

4 个答案:

答案 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的结果,则可以使用。