成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

什么是JavaScript異步編程

開發 前端
異步在javascript就是延時執行。嚴格來說,javascript中的異步編程能力都是由BOM與DOM提供的,如setTimeout,XMLHttpRequest,還有DOM的事件機制,還有HTML5新增加的webwork, postMessage,等等很多。

這可能是個比較深的話題。何謂異步?

籠統地說,異步在javascript就是延時執行。嚴格來說,javascript中的異步編程能力都是由BOM與DOM提供的,如setTimeout,XMLHttpRequest,還有DOM的事件機制,還有HTML5新增加的webwork, postMessage,等等很多。這些東西都有一個共同的特點,就是擁有一個回調函數,實現控制反轉。由于控制反轉是更深奧的問題,這里不想展開。不過有點可以確認的,回調函數的存在打斷了原來的執行流程,讓它們自行在適當的時機出現并執行,這是個非常便捷的模式。對比主動式的輪詢,你就知它多么節能。在同步編程,代碼基本上自上向下執行,在異步編程,一些代碼就要寫到回調函數中,如果代碼之間存在依賴,回調函數套回調函數的情況也不少見,這種套嵌結構對以后的維護來說簡直是地獄。還有一種我們不得不面對的情況,try...catch無法捕捉幾毫秒之后發生的異常。另外,除了setTimeout外,異步編程基本上由事件機制承擔的,它們的回調函數什么時候發生基本上都是未知數,可能由于后臺發生系統級錯誤,無法再發出響應,或者,系統忙碌,一時半刻響應不過來,這兩種情況我們也必需提供一個策略,中斷這操作,也就是所謂的abort,這些都是異步編程的所要處理的課題。

  1. $.post("/foo.json", function (dataOfFoo) {//多層套嵌結構的Ajax回調  
  2.   $.post("/bar.json", function (dataOfBar) {  
  3.     $.post("/baz.json", function (dataOfBaz) {  
  4.       alert([dataOfFoo, dataOfBar, dataOfBaz]);  
  5.     });  
  6.   });  
  7. });  
  1. function throwError(){  
  2.   throw new Error('ERROR');  
  3. }  
  4.    
  5. try{  
  6.   setTimeout(throwError, 3000);  
  7. } catch(e){  
  8.   alert(e);//這里的異常無法捕獲  
  9. }  

由于在javascript編程,隨時都碰到這樣的需求,因此實現相關輕捷的API是重中之重。正如上面所說,它只少要有以下功能,能儲存一組回調函數(domReary,多投事件,特效),在特定時刻中執行所有回調函數,如果發生錯誤能觸發相應的處理函數(負向回調),能中止整個操作,從中斷處再起操作,如果要求更多,我們還想能從串行轉向并行,由并行轉入串行。可能有許多概念大家聽不懂,是不是?但想弄個好的特效,這些都是必需的。如果玩過后端JS的人,一定聽說過node.js,現在基本成為它的代名詞了。路由派發,IO操作,都是異步的,事件驅動的,為了實現優雅的異步編程,大牛們忙得焦頭爛額,一個個方案被提出來,如do.js. step.js, async.js, flow.js……,不是太雞肋,就是無法應用于前端。因此我們需要一個適合于前端的方案。

有件事我們必需明白,你想到的,人家都早已研究過了,并且已給出解決方案。十大javascript框架之一,Mochikit,就從Python的Twisted庫搞來Deferred,后來又給dojo學去,現在你們又看到,相同的東西又出現在jQuery1.5上了。不過,Mochikit的Deferred還有一個不為人知的分支,由日本大牛cho45搞出來(他同時也搞什么BigInt,跨瀏覽器Testing,名氣緊隨amachang、uupaa、edvakf、nanto之后),叫JSDeferred。先說dojo那派系的(包括jQuery)的Deferred,一直處于無敵狀態,與Common.js搞出一套規范,什么promises,then,when都是那時制定,jQuer基本全盤接受。另一分支,cho45的JSDeferred,構思非常奇特,沒有使用數組來裝載回調函數,而是通過setTimeout,image.onload, postMessage等異步機制巧妙地把維護列隊地工作道回瀏覽器自身,雖然有致命缺陷,但其易用性也被日本JS界所首肯,我的Deferred對象就從它的基本上發展過來的。Deferred這東西,我通常稱之為異步列隊,因為它們的確是需要兩組由回調函接構成的隊列,非常之形象。

在我們搬出異步列隊之前,讓我們看看普通的列隊是怎么實現延遲的。

  1. var Queue = function(){  
  2.       this.list = []  
  3.     }  
  4.     Queue.prototype = {  
  5.       constructor:Queue,  
  6.       queue:function(fn) {  
  7.         this.list.push(fn)  
  8.         return this;  
  9.       },  
  10.       dequeue:function(){  
  11.        var fn = this.list.shift()||function(){};  
  12.        fn.call(this)  
  13.       }  
  14.     }  

這樣調用它:

  1. var q = new Queue;  
  2.     q.queue(function(){  
  3.       log(1)  
  4.     }).queue(function(){  
  5.       log(2)  
  6.     }).queue(function(){  
  7.       log(3)  
  8.     });  
  9.     while(q.list.length){  
  10.       q.dequeune();  
  11.     }  

但這是同步,想異步,我們需要用setTimeout,

  1. var el = document.getElementById("test");  
  2. var q = new Queue();  
  3. q.queue(function(){  
  4.   var self = this;  
  5.   el.innerHTML = 1 
  6.   setTimeout(function(){  
  7.     self.dequeue()  
  8.   },1000);  
  9. }).queue(function(){  
  10.   var self = this;  
  11.   el.innerHTML = 2 
  12.   setTimeout(function(){  
  13.     self.dequeue()  
  14.   },1000);  
  15. }).queue(function(){  
  16.   var self = this;  
  17.   el.innerHTML = 3 
  18.   setTimeout(function(){  
  19.     self.dequeue()  
  20.   },1000);  
  21. }).dequeue()  

如大家所見,這樣寫絕對不友好。我們需要把setTimeout整到Queue類中去,另對queue做一些修改,不要只彈出一個函數進行執行,通常情況下會對列隊中的所有回調進行操作的,如domReay,多投事件。

  1. var Queue = function(){  
  2.   this.list = []  
  3. }  
  4. Queue.prototype = {  
  5.   constructor:Queue,  
  6.   queue:function(fn) {  
  7.     this.list.push(fn)  
  8.     return this;  
  9.   },  
  10.   wait:function(ms){  
  11.     this.list.push(ms)  
  12.     return this;  
  13.   },  
  14.   dequeue:function(){  
  15.     var self = thislist = self.list;  
  16.     var el = list.shift()||function(){};  
  17.     if(typeof el == "number"){  
  18.       setTimeout(function(){  
  19.         self.dequeue();  
  20.       },el);  
  21.     }else if(typeof el == "function") {  
  22.       el.call(this)  
  23.       if(list.length)  
  24.         self.dequeue();  
  25.     }  
  26.   }  
  27. }  

Great,如果我們能自由控制每個回調的間隔,這對于做動畫效果說,就變得非常簡單了。但這Queue類相對我們最初定下的目標來說,還是差得遠。Ajax,多投事件,domReay將統統劃歸于它的麾下,因此它需要用一些適用性更強的API。用過dojo的人也知,它的Deferred就像DNA的染色體一樣,是雙線的,可以捕捉不在同一時間線上的異常,而且這些列隊不能像衛生筷那樣用完一次就廢了,這樣就無法支撐多投事件的實現了。想要實現這些功能,就需要一個很復雜的東西,我將在第二部分隆重介紹我的異步列隊,看它是如何優雅地解決這些問題。

原文:http://www.cnblogs.com/rubylouvre/archive/2011/03/14/1982699.html

【編輯推薦】

  1. JavaScript異步編程之Jscex無創痕切入jQueryUI
  2. Jscex+jQuery UI打造游戲力度條
  3. Jscex模擬重力場與google蘋果logo的比較
  4. JavaScript異步編程之用Jscex畫圓
責任編輯:陳貽新 來源: 司徒正美的博客
相關推薦

2020-10-15 13:29:57

javascript

2017-07-13 12:12:19

前端JavaScript異步編程

2016-09-07 20:43:36

Javascript異步編程

2015-04-22 10:50:18

JavascriptJavascript異

2014-05-23 10:12:20

Javascript異步編程

2024-11-08 09:48:38

異步編程I/O密集

2021-06-02 09:01:19

JavaScript 前端異步編程

2021-12-10 07:47:30

Javascript異步編程

2011-07-27 14:10:43

javascript

2022-10-31 09:00:24

Promise數組參數

2023-12-04 13:22:00

JavaScript異步編程

2011-11-10 10:23:56

Jscex

2021-06-06 19:51:07

JavaScript異步編程

2013-04-01 15:38:54

異步編程異步編程模型

2013-03-08 09:33:25

JavaScript同步異步

2016-10-21 11:04:07

JavaScript異步編程原理解析

2013-01-07 10:44:00

JavaScriptjQueryJS

2020-03-23 11:28:56

PythonJavaScript技術

2015-10-20 13:11:23

JavascriptHoisting

2021-11-01 22:36:04

JavaScript
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产网站在线免费观看 | 成人精品久久 | 噜啊噜在线 | 精品亚洲视频在线 | 国产免费一区二区三区 | 日韩aⅴ视频 | 日韩一区二区三区四区五区 | 日韩理论电影在线观看 | 成人亚洲精品 | 天天干狠狠 | 特级一级黄色片 | 中文字幕国产精品 | 久久av网 | 欧美一区不卡 | 欧美日韩在线精品 | 不卡的av一区 | 亚洲欧美激情精品一区二区 | www国产亚洲精品久久网站 | 国产一区二区三区四区 | 成人九色 | 久久av.com| 亚洲黄色一区二区三区 | 久久久成人网 | 成人小视频在线观看 | 中文字幕一区二区三区乱码在线 | 精品久久久一区二区 | 丁香久久 | 日本高清不卡视频 | 国内精品久久久久久 | 亚洲一区二区中文字幕 | 成人午夜免费福利视频 | 日韩一二三区视频 | 国产精品久久久久国产a级 欧美日韩国产免费 | 日韩美女在线看免费观看 | 亚洲精品亚洲人成人网 | 成人午夜网站 | 粉嫩av久久一区二区三区 | 荷兰欧美一级毛片 | 亚洲精品久久久久久久不卡四虎 | 久久精品免费一区二区三 | 精产嫩模国品一二三区 |