指定调用次数

underscore 还为我们提供了一系列与函数调用次数相关的 API,下面我们逐一分析。

_.after

_.after(times, func):创建一个函数,该函数运行 times 次后,才执行传入的回调 func

源码

_.after = function (times, func) {
  return function () {
    if (--times < 1) {
        return func.apply(this, arguments);
    }
  };
};

假设我们异步请求一个博客文章列表,当所有文章都请求成功后,才执行最终的回调:

var TOTAL_COUNT = 20;
var showComplete = _.after(TOTAL_COUNT, function() {
  console.log("请求成功");
});

for(var i=0;i<TOTAL_COUNT;i++) {
  $.ajax({
    url: 'getBlog',
    success: showComplete
  });
}

_.before

_.before(times, func):创建一个函数,该函数每次调用都会执行回调函数 func,直至指定 times 次后,执行结果不再改变。

源码

_.before = function (times, func) {
    // memo暂存最近一次的调用结果,当调用次数达到times次后,memo不再改变
    var memo;
    return function () {
        if (--times > 0) {
            memo = func.apply(this, arguments);
        }
        // 清除函数引用,节省内存
        if (times <= 1) func = null;
        return memo;
    };
};

用例:

var n = 3;
var before3 = _.before(3,function(){return --n;});
before3(); //=> 3
before3(); //=> 2;
before3(); //=> 2;// 到第三次时,结果不再发生变化
before3(); //=> 2;

_.once

_.once(func):保证 func 只执行一次。

源码

_.once = _.partial(_.before, 2);

用例

_.once 还可用作初始化函数:

var init = function() {
  console.log("initializing!");
}
var initOnce = _.once(init);
initOnce();
initOnce();
//=> "initializing";

results matching ""

    No results matching ""