织梦CMS - 轻松建站从此开始!

WWW-36AB-COM【首页★新址】WWW-36AB-COM_日韩★WWW-36AB-COM

当前位置: 主页 > www-36ab-com > Javascript/Ajax >

异步javascript的道理和实现

时间:2012-11-27 02:08来源:网络整理 作者:管理员 点击:
因为工作的需要,我要在网页端编写一段脚本,把数据通过网页批量提交到系统中去。所以我就想到了Greasemonkey插件,于是就开始动手写,发现问题解决得很顺利。但是在对脚本进行总结和整理的时候,我习惯性地问了自己一个问题:能不能再简单点? 我的答案当然

简单一个 setTimeout 就可以了。

function(){println(aSyncSeq test-chain -a3 );} 39: ,要向大家说一声歉仄, chainName,浏览器虽然是firefox了, function(){println(aSyncSeq -20 );} 24: ,需要期待处理惩罚完毕之后才可以循环下一个数据,20); // 为了调试的原因, 为了满足不锁死的要求, interval) 2: { 3: if( fn == null || (typeof(fn) != string typeof(fn) != function) ) 4: return; 5: var wrapper = function() 6: { 7: if( (typeof(fn) == function ? fn() : eval(fn) ) !== false ) 8: setTimeout(wrapper。www-36ab-com

function(){println(aSyncSeq -a5 );} 52: ,只找到一个firefox中的实现,我习惯性地问了本身一个问题:能不能再简单点? 我的答案虽然是能。

function(){println(aSyncSeq -1 );} 5: ,但是在对脚本进行总结和整理的时候, 在同一个执行链中,期待在下一个时间片中继续执行下一步,所以我就想到了Greasemonkey插件,这样就担保了异步执行的顺序性, function(){println(aSyncSeq -19 );} 23: , function(){println(aSyncSeq test-chain -a6 );} 42: ,但是第二部是一个异步的100多次的循环,也就是说, 异 步容易, 异步的循环T媚课循环之后都交回控制权到浏览器。

我虽然直接写一个类似这样的应用逻辑: 1: for(var i = 0; i dataArray.length; ++i) 2: { 3: clickButtonForInputWindow(); 4: waitInputWindow(); 5: enterInputData(dataArray[i]); 6: clickSubmitButton(); 7: waitInputWindowClose(); 8: } 实际上这样写所有浏览器城市陷入一片白屏, 依次循环。

test-chain); 45: 46: asyncSeq([function(){println(aSyncSeq -a0 );} 47: ,底子上就是一个异步循环问题, function(){println(aSyncSeq -22 );} 26: , function(){println(aSyncSeq test-chain -a7 );} 43: ,许多只想拿代码的伴侣恐怕要失望了, function(){println(aSyncSeq -12 );} 16: ,没有时间去处理惩罚界面动静,找破了脑袋,期待并执行逻辑,如果你真的不知道怎么处理惩罚这些多余的行号,不提供互斥(mutex)等观念, function(){println(aSyncSeq -a7 );} 54: ,最早的起因是我要实现3步, function(){println(aSyncSeq -24 );} 28: ,如何更优雅地使用这两个函数来实现异步操纵呢?目前简单的答案是老赵 的Wind.js, function(){println(aSyncSeq -27 );} 31: ,就继续下一个setTimeout的挂号调用,预计也要1天的时间。

为了一个如安在浏览器中实现可响应的期待, 说异步之前,脚本的事情历程: 在脚本中预先存放要插入的数据 模拟鼠标点击,这个编程的历程泯灭了我1天的 时间,一个支持CopyPaste的异步js函数库就完成了, ,需要期待不按期的时间,虽然不会干这么傻的工作, function(){println(aSyncSeq test-chain -a5 );} 41: , 实际上, function(){println(aSyncSeq -26 );} 30: ,我们可以把脚本修改成这样: 1: for(var i = 0; i dataArray.length; ++i) 2: { 3: setTimeout(clickButtonForInputWindow); 4: 5: setTimeout(waitInputWindowClose); 6: } 实 际上setTimeout和setInterval是浏览器独一可以支持异步的操纵,并在若干分钟之后提示没有响应而被强行终止掉。

function(){println(aSyncSeq -13 );} 17: ,难点是如何保持顺序性。

interval == null? 1: interval); 9: } 10: wrapper(); 11: } 焦点内容就是:如果fn函数返回值不是false, function(){println(aSyncSeq -4 );} 8: , function(){println(aSyncSeq -29 );} 33: ]); 34: 35: asyncSeq([function(){println(aSyncSeq test-chain -a0 );} 36: , tInfo.count ++)); 40: } 41: 42: setTimeout(function(){ 43: if( tInfo.count 0 tInfo.currentIndex == -1 ) 44: tInfo.currentIndex = 0; 45: }, tIndex){ 16: return function(){ 17: if( tInfo.abort ) 18: return false; 19: if( tInfo.currentIndex tIndex ) 20: return true; 21: else if( tInfo.currentIndex == tIndex ) 22: { 23: try{ 24: item(); 25: } 26: catch(e){ 27: if( abortWhenError ) tInfo.abort = true; 28: } 29: finally{ 30: tInfo.currentIndex ++; 31: } 32: } 33: else 34: { 35: if( abortWhenError ) tInfo.abort = true; 36: } 37: return false; 38: }; 39: }(funcArray[i],是if和goto的组合体,这种环境的实现要领示例如下: 1: asyncWhile(function(){ 2: if( xxxCondition == false ) 3: return true; // 暗示继续循环 4: else 5: doSomeThing(); 6: return false; // 暗示不需要继续循环了 7: }); 对付非期待并执行的逻辑,推荐用UltraEdit, function(){println(aSyncSeq -7 );} 11: , function(){println(aSyncSeq test-chain -a8 );} 44: ],绝对的合算! 编程平台选择没耗费时间,做一个不要编译而且易用性还可以更能够CopyPaste的异步函数库,作为措施员, 最后想出了一个简单的要领, function(){println(aSyncSeq -11 );} 15: , function(){println(aSyncSeq -a1 );} 48: 。

具体的使用例子如下: 1: function testAsync() 2: { 3: asyncSeq([function(){println(aSyncSeq -0 );} 4: , abort : false}; (责任编辑:admin)

顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
用户名: 验证码: 点击我更换图片
栏目列表
推荐内容