只在第一次回调时运行函数,但更优雅的方式

Run a function only at first callback, but more elegantly way

本文关键字:方式 函数 第一次 回调 运行      更新时间:2023-09-26

我希望总是得到"true"的结果,但要用一种更优雅的方式。这可能吗?

function callB(cb) {
  var i = 1;
  while (i <= 5) {
    cb(i);
    i++;
  }
}
var i = 0;
callB(function(data) {
  console.log(data);
  if (i === 0) {
    console.log(true);
    i++;
  }
});

我希望结果总是在第一次回调之后,但在那之后,callb函数不会继续生成更多的回调

您可以将整个部分封装在以前调用的函数中。

如果是第一次调用,此函数会跟踪,并阻止回调的更多调用。

function once(fn) {
    var run = true;
    return function() {
        console.log(arguments); // omit later
        if (run) {
            fn.apply(null, arguments);
            run = false;
        }
    }
}
function callB(cb) {
    var i = 1;
    while (i <= 5) {
        cb(i);
        i++;
    }
}
callB(once(function (value) {
     console.log(value, true);
}));

当您运行此操作一次并且您关心的是性能时,请不要将回调放入循环中。

function callB(cb) {
  var i = 1;
  cb(i);
  while (i <= 5) {
    i++;
  }
}
callB( v => console.log('Runs once with value ' + v));

我根据需要调整了函数,因此:

function once(fn) {
    var run = true;
    var timeout = setTimeout(function () {
        if (run) {
            fn(false);
            run = false;
        }
    }, 5000);
    return function () {
        console.log(arguments); // omit later
        if (run) {
            fn.apply(null, arguments);
            //resolve(true);
            clearTimeout(timeout);
            run = false;
        }
    };
}
function callB(cBa) {
    var i = 1;
    while (i <= 5) {
        //cBa(i);
        i++;
    }
}
callB(once(function (value) {
    console.log(value);
}));