Tony Huang's profileSouline PLUS planBlogListsNetwork Tools Help

Blog


    10 January

    AJAX 异步串行化库

    今天总结了一下异步操作串行化的方法,写了个简单的串行化库
    LIBRARY:  Souline.AsyncLoop.js
     
    async = {
        // while
        wh : function(func_cond, func_body, func_end) {
            function _async_while() {
                if (!func_cond()) {
                    func_end();
                    return;
                }
               
                func_body(function() {
                    // next
                    _async_while();
                }, function() {
                    // break
                    func_end();
                    return;
                });
            }
           
            _async_while();
        },
        //for
        fo : function(start, end, func_body, func_end) {
            var i = start;
            
            this.wh(function() { return i <= end; }, function(func_next, func_break) {
                func_body(i++, func_next, func_break);
            }, function() {
                func_end(i);
            });
        },
        // for each
        each : function(collection, func_body, func_end) {
            this.fo(0, collection.length - 1, function(i, callback) {
                func_body(collection[i], callback);
            }, func_end);
        }
    };
     
    用法也很简单啊:
    async.fo(1, 40, function(i, func_next, func_break) {
        // do something on i
        if (breakCondition) {
            func_break();
            return;
        }
     
        func_next();
    });
    07 January

    AJAX 异步处理中的一种技巧

    今天在写 九城 的 WebGame 九州战记的外挂(或者说插件吧),所有的操作都是异步的,有了一下的一点感悟:
     
    在很多情况下,我们需要顺序的完成一些异步的操作:
    比如:整理背包功能:
     
    我们需要顺序的将每一个不在它应该在的位置上的物品移动到位置上,但是移动物品是异步的操作,这部分,我写了一个函数:
     
    function moveCard(name, num, pos, newPos, callback) {
        $.get(moveCardUrl(name, num, pos, newPos), callback);
    }
     
    然后我写了个moveCards函数,遍历数组:
     
    function moveCards(cards) {
        for(var i = 0; i < cards.length; i++) {
            var card = cards[i];
            var oldPos = card.Pos;
            var newPos = i + 1;
     
            if(oldPos != newPos) {
                moveCard(card.Name, card.Num, oldPos, newPos);
            }
        }
    }
     
    这是,所有的请求并不是串行执行的,(其实也不是完全并行的,因为HTTP协议规定,一个客户端和一个服务器之间最多能保持两个连接)
     
    所以,我对这个函数进行了改变:
     
    function moveCards(cards) {
        var i = 0;
     
        function _moveCard() {
            while((i < cards.length) && ((i + 1) == cards[i].Pos)) i++;
     
            if(i == cards.length)
                return;
     
            var card = cards[i];
            var oldPos = card.Pos;
            var newPos = i + 1;
     
            if(oldPos != newPos) {
                moveCard(card.Name, card.Num, oldPos, newPos, function() {
                    i ++;
                    _moveCard();
                });
            }
        }
    }