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

时间:2016-07-18 07:28:59

标签: javascript callback

我希望始终获得“真实”的结果,但是要以更优雅的方式。这可能吗?

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函数不会继续生成更多的回调

3 个答案:

答案 0 :(得分:2)

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

此功能会跟踪它是否是第一个呼叫,并阻止更多的回叫呼叫。

&#13;
&#13;
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);
}));
&#13;
&#13;
&#13;

答案 1 :(得分:1)

当你运行一次并且你的关注是性能时,不要把你的回调放在循环中。

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

答案 2 :(得分:-1)

我根据自己的需要调整了功能,因此:

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);
}));