| Tony Huang's profileSouline PLUS planBlogListsNetwork | Help |
|
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();
});
} }} |
|
|