next-tick

把一些异步操作整合到下一个CPU时间片执行,比多个异步操作多次调用setTimout(fn,0)的效率要高(摘自美团前端团队)

/**
 * 将函数延迟执行
 *
 * @param {Function} fn 希望被延迟执行的函数
 * @param {Object} context 执行函数时上下文环境
 * @param {...} args 执行调用多个参数
 * @access public
 * @return {Number} 等待执行的任务数
 *
 * @example
 *
 * var fn = function(){
 *      console.log(2);
 * };
 *
 * nextTick(fn);
 * console.log(1);
 *
 * // 1
 * // 2
 */
'use strict';


(function (global, undefined) {

    var callbacks = []; //等待调用的函数栈
    var running = false; //当前是否正在运行中
    var slice = [].slice;
    var setImmediate = global.setImmediate || function (fn) {
            return global.setTimeout(fn, 0);
        };

    //调用所有在函数栈中的函数
    //如果在执行某函数时又有新的函数被添加进来,
    //该函数也会在本次调用的最后被执行
    function callAllCallbacks() {
        var cbs = callbacks;
        callbacks = [];
        running = false;

        var count = cbs.length;
        for (var index = 0; index < count; index++) {
            var callback = cbs[index];
            var fn = callback[0];
            var context = callback[1];
            fn.apply(context, callback.slice(2));
        }
    }

    function nextTick(fn, context, args) {
        var callback = slice.call(arguments);

        //将函数存放到待调用栈中
        callbacks.push(callback);

        //判断定时器是否启动
        //如果没有启动,则启动计时器
        //如果已经启动,则不需要做什么
        //本次添加的函数会在 callAllCallbacks 时被调用
        if (!running) {
            running = true;
            setImmediate(callAllCallbacks, 0);
        }

        return callbacks.length;
    }

    if (typeof module === 'object' && module && typeof module.exports === 'object') {
        module.exports = nextTick;
    } else if (typeof define === 'function' && define.amd) {
        define('nextTick', [], function () {
            return nextTick;
        });
    } else {
        global.nextTick = nextTick;
    }

})(typeof global === 'object' ? global : window);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,795评论 8 265
  • OC语言基础 1.类与对象 类方法 OC的类方法只有2种:静态方法和实例方法两种 在OC中,只要方法声明在@int...
    奇异果好补阅读 9,787评论 0 11
  • 本文是我自己在秋招复习时的读书笔记,整理的知识点,也是为了防止忘记,尊重劳动成果,转载注明出处哦!如果你也喜欢,那...
    波波波先森阅读 13,872评论 4 56
  • 单纯积累知识、经验是不够的,还需要有慧心。 知识、经验是知的范畴。而慧心是心态、思想范畴。两方面的融合,才能组成智...
    Angkon阅读 2,999评论 0 0
  • 因为各种原因,我只能在家,然后选择了写作这条路。虽然这条路并不好走,但是我就是喜欢,至少拾起了学生时代喜欢做...
    大王玉儿阅读 1,241评论 0 0