延时执行

在 underscore 中,提供了两个函数,用于延时执行函数。

_.delay

_.delay(wait, func):等待 wait 毫秒,执行函数 func

源码

// master
_.delay = restArgs(function (func, wait, args) {
    return setTimeout(function () {
        return func.apply(null, args);
    }, wait);
});

// 1.8.3
_.delay = function(func, wait) {
    var args = slice.call(arguments, 2);
    return setTimeout(function(){
        return func.apply(null, args);
    }, wait);
};

可以看到,_.delay 只是 js 内置函数 setTimeout 的一次封装,但要注意的,_.delay 会将待延迟执行的函数上下文 “绑定” 到 null,所以,传入回调的时候,一定要确保上下文已经正确绑定(也就是先替换掉函数中 this,避免之后 this 被错误绑定)。

这里的绑定之所以打引号,是因为调用 apply 或者 call 的时候,如果传递的第一个参数是 null 或者 undefined,那么 this 就会被绑定到全局对象上。

用例

var log = _.bind(console.log, console);
_.delay(log, 1000, "show after 1 sec");
// => "show after 1 sec" //至少1s之后打印该字符串

_.defer

_.defer(func):将 func 异步化。

源码

_.defer = _.partial(_.delay, _, 1);

这就是偏函数的能力,现在创建新函数变得如此简单,基础函数是 _.dalay,通过指定 wait 参数,我们创建了一个新函数,该函数会被推迟至少 1ms 才执行,亦即,我们将传入的任务异步化。

用例

_.defer(function() { console.log('2');});
console.log('1');
// => "1"
// => "2"

results matching ""

    No results matching ""