The source code

    /**
     * @ignore
     *  queue of anim objects
     * @author yiminghe@gmail.com
     */
    KISSY.add('anim/queue', function (S, DOM) {

        var // 队列集合容器
            queueCollectionKey = S.guid('ks-queue-' + S.now() + '-'),
        // 默认队列
            queueKey = S.guid('ks-queue-' + S.now() + '-'),
        // 当前队列是否有动画正在执行
            processing = '...';

        function getQueue(el, name, readOnly) {
            name = name || queueKey;

            var qu,
                quCollection = DOM.data(el, queueCollectionKey);

            if (!quCollection && !readOnly) {
                DOM.data(el, queueCollectionKey, quCollection = {});
            }

            if (quCollection) {
                qu = quCollection[name];
                if (!qu && !readOnly) {
                    qu = quCollection[name] = [];
                }
            }

            return qu;
        }

        function removeQueue(el, name) {
            name = name || queueKey;
            var quCollection = DOM.data(el, queueCollectionKey);
            if (quCollection) {
                delete quCollection[name];
            }
            if (S.isEmptyObject(quCollection)) {
                DOM.removeData(el, queueCollectionKey);
            }
        }

        var q = {

            queueCollectionKey: queueCollectionKey,

            queue: function (anim) {
                var el = anim.config.el,
                    name = anim.config.queue,
                    qu = getQueue(el, name);
                qu.push(anim);
                if (qu[0] !== processing) {
                    q.dequeue(anim);
                }
                return qu;
            },

            remove: function (anim) {
                var el = anim.config.el,
                    name = anim.config.queue,
                    qu = getQueue(el, name, 1), index;
                if (qu) {
                    index = S.indexOf(anim, qu);
                    if (index > -1) {
                        qu.splice(index, 1);
                    }
                }
            },

            removeQueues: function (el) {
                DOM.removeData(el, queueCollectionKey);
            },

            removeQueue: removeQueue,

            dequeue: function (anim) {
                var el = anim.config.el,
                    name = anim.config.queue,
                    qu = getQueue(el, name, 1),
                    nextAnim = qu && qu.shift();

                if (nextAnim == processing) {
                    nextAnim = qu.shift();
                }

                if (nextAnim) {
                    qu.unshift(processing);
                    nextAnim._runInternal();
                } else {
                    // remove queue data
                    removeQueue(el, name);
                }
            }

        };
        return q;
    }, {
        requires: ['dom']
    });