亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

詳談javascript異步編程

2019-11-20 10:32:48
字體:
來源:轉載
供稿:網友

異步編程帶來的問題在客戶端Javascript中并不明顯,但隨著服務器端Javascript越來越廣的被使用,大量的異步IO操作使得該問題變得明顯。許多不同的方法都可以解決這個問題,本文討論了一些方法,但并不深入。大家需要根據自己的情況選擇一個適于自己的方法。

本文為大家詳細介紹js中的異步編程,具體內容如下

一 關于事件的異步

事件是JavaScript中最重要的一個特征,nodejs就是利用js這一異步而設計出來的。所以這里講一下事件機制。

在一個js文件中,如果要運行某一個函數,有2中手段,一個就是直接調用,比如foo(),第二就是利用事件來觸發,這中函數也叫回調函數,比如傳遞給setTimeout函數和onready屬性。

1.setTimeout函數中的事件異步
setTimeout本質上也是一種異步事件,當延遲時間到的時候觸發該事件,但是有的有的時候(其實也是大部分時候)都不會按照給定的延遲時間執行,先看下面的代碼

  var start = new Date();  setTimeout(function() {   console.log('settimeout1:',new Date()-start);  }, 500);  while (new Date() - start < 1000) {   console.log('in while');  }  document.getElementById('test').addEventListener('click', function(){   console.log('test:',new Date()-start);  }, false)  for(var i=0;i<10000;i++){   console.log('in for');  }  setTimeout(function(){   console.log('settimeout2: ',new Date()-start);  },1000);  /* 10214  in while  index.jsp (第 19 行)  10000  in for  index.jsp (第 25 行)  settimeout1: 2263  index.jsp (第 16 行)  settimeout2: 3239  index.jsp (第 28 行)  test: 10006  index.jsp (第 22 行)  test: 28175  index.jsp (第 22 行)  test: 28791  index.jsp (第 22 行)  test: 28966  index.jsp (第 22 行) */

如果按照正常的理解,延遲函數應該在500毫秒之后打斷while循環,而事實上并沒有,并且,我在while循環和for循環期間點擊div時候并沒有立即輸出test,給出的解釋就是:

a)事件隊列。調用setTimeout函數的時候,會把傳入它的回調函數加入到事件隊列中去(事件已經初始化并且在內存了),然后繼續執行后面的代碼,直到再也沒有代碼可以運行(沒有正常的運行流了,不包括事件函數等異步的內容),就會從事件隊列里面pop出一個合適的事件來運行。

b)js是單線程的,事件處理器在線程空閑之前是不會運行的。

2 普通事件的異步和setTimeout類似
二 promise對象和deferred對象

1. promise
promise是一種解決ajax等異步編程回調函數嵌套太多導致代碼晦澀難懂的解決方案,特別是在nodejs中,異步無處不在。不同的框架對promise的實現,一下是jquery中的promise的API。

這里不講promise的實現原理,關于原理在另外的篇幅中介紹。

傳統的ajax異步編程是這么寫的(jquery1.5之前):

$.get('url', function(){ $.get('url1', function(){  $.get('url2', function(){  }, 'json'); }, 'json');}, 'json');

 這么寫代碼給開發和維護帶來了極大的困難,好在jquery1.5以后引入了promise,就可以這么寫了:

 $.ajax( "example.php" ).done(function() { alert("success"); }).fail(function() { alert("error"); }).always(function() { alert("complete"); });

 現在看上去就明顯簡單多了。

2.deferred對象

var nanowrimoing = $.Deferred();var wordGoal = 5000;nanowrimoing.progress(function(wordCount) {var percentComplete = Math.floor(wordCount / wordGoal * 100);$('#indicator').text(percentComplete + '% complete');});nanowrimoing.done(function(){$('#indicator').text('Good job!');});

三.worker對象和多線程

四.異步腳本加載

1.傳統腳本在頁面中的位置
腳本分為兩大類:阻塞式和非阻塞式。這里的阻塞是指加載阻塞而不是運行阻塞。

<!DOCTYPE html><html><head><script src="headScript"></script><script defer src="deferredScript"></script></head><body> <script async defer src="chatWidget"></script> <script async defer src="asyncScript"></script></body></html>

上面這部分代碼是比較標準的關于腳本在一個頁面中的位置,1.其中傳統的未加任何修飾的headScript是阻塞式的腳本,由于瀏覽器從上到下解釋執行JavaScript,所以這部分腳本文件在一開始就會被執行,并且在執行完之前是DOM是不會渲染的,但是head標簽里面的css會加載。2.有defer屬性的腳本會在DOM渲染的同時進行加載,但是會在DOM渲染完畢之后才開始執行,不幸的是,不是所有的瀏覽器都支持defer屬性,所以才會有了jquery(function)這個東西。3.同時帶有async屬性和defer屬性時候,defer會覆蓋async,但是單獨有async的時候,腳本會在DOM渲染的時候加載并且運行。

2.可編程的腳本加載
如果不是一開始就在頁面種引入js文件,而是通過用戶交互來實現動態的加載js腳本,可以通過編程方式加入。

瀏覽器獲取服務器腳本有2個方法,ajax獲取并且通過eval函數執行,另外一個就是在DOM中插入<script>標簽,一般用第二種方法,因為瀏覽器幫助我們生成HTTP請求以及eval會泄露作用域。

var head = document.getElementsByTagName('head')[0];var script = document.createElement('script');script.src = '/js/feature.js';head.appendChild(script);script.onload = function() {// 現在可以調用腳本里定義的函數了}

以上就是本文的全部內容,希望對大家學習js異步編程有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品日韩av| 国产精品成人免费电影| 亚洲国产一区二区三区四区| 亚洲精品乱码久久久久久金桔影视| 日韩中文字幕亚洲| 精品偷拍各种wc美女嘘嘘| xvideos亚洲| 国模极品一区二区三区| 欧美大片免费观看在线观看网站推荐| 欧美激情精品久久久久久黑人| 欧美成人精品一区| 精品中文字幕久久久久久| xxx欧美精品| 最近中文字幕mv在线一区二区三区四区| 中文亚洲视频在线| 8050国产精品久久久久久| 亚洲欧美在线免费观看| 国产精品久久电影观看| 91久久精品视频| 国产精品草莓在线免费观看| 欧美激情a∨在线视频播放| 岛国av一区二区在线在线观看| 91久久精品视频| 欧美日韩第一视频| 久久综合国产精品台湾中文娱乐网| 亚洲护士老师的毛茸茸最新章节| 自拍视频国产精品| 亚洲丝袜在线视频| 正在播放国产一区| 欧美日韩亚洲一区二区三区| 欧美在线免费视频| 国产精品久久久久久久天堂| 国产精品激情自拍| 成人性生交大片免费观看嘿嘿视频| 欧美视频免费在线观看| 国产精品免费网站| 精品视频偷偷看在线观看| 九九热精品视频在线播放| 久久久国产精彩视频美女艺术照福利| 2019亚洲男人天堂| 国产精品美女主播| 欧美黄色小视频| 中文字幕亚洲无线码在线一区| 亚洲男人天堂视频| 亚洲精品成人av| 国产一区二区三区视频在线观看| 亚洲一区美女视频在线观看免费| 日本欧美黄网站| 国产精品海角社区在线观看| 欧美肥老太性生活视频| 欧美有码在线视频| 久久久最新网址| 538国产精品视频一区二区| 亚洲一区二区三区香蕉| 日韩欧中文字幕| 亚洲第一中文字幕| 久久国产精品久久久久| 日韩欧美极品在线观看| 国产精品扒开腿做爽爽爽的视频| 国产精品高潮呻吟久久av野狼| 国产成人精品国内自产拍免费看| 国产精品va在线播放我和闺蜜| 韩日欧美一区二区| 中文字幕视频一区二区在线有码| 国产精品海角社区在线观看| 亚洲国产97在线精品一区| 欧美精品性视频| 亚洲精品不卡在线| 91日本在线视频| 国产亚洲精品激情久久| 欧美福利在线观看| 91精品国产777在线观看| 国产精品久久久久不卡| 欧美日韩中文字幕日韩欧美| 亚洲片在线观看| 欧美激情伊人电影| 最好看的2019年中文视频| 国产精品福利在线| 538国产精品一区二区免费视频| 欧美疯狂性受xxxxx另类| 精品久久久久久| 97超级碰在线看视频免费在线看| 原创国产精品91| 亚洲国产日韩一区| 亚洲天堂免费视频| 亚洲天堂av在线免费| 国产亚洲成av人片在线观看桃| 国产精品久久久久影院日本| 成人一区二区电影| 国产区亚洲区欧美区| 98精品国产高清在线xxxx天堂| 亚洲精品99久久久久| 26uuu日韩精品一区二区| 在线观看视频99| 国产一区二区在线免费视频| 2019国产精品自在线拍国产不卡| 日韩一二三在线视频播| 久久精品视频中文字幕| 国产精品久久久久福利| 国产999在线观看| 日韩欧美国产成人| 97在线日本国产| 欧美激情性做爰免费视频| 色妞色视频一区二区三区四区| 亚洲国产精品成人va在线观看| 国产精品99蜜臀久久不卡二区| 亚洲成人av资源网| 国模吧一区二区三区| 欧美丰满少妇xxxxx做受| 正在播放欧美视频| 久久网福利资源网站| 精品国模在线视频| 国产精品一区二区久久| 97超级碰在线看视频免费在线看| 欧美久久精品午夜青青大伊人| 国产精品自产拍在线观| 亚洲一区二区自拍| 亚洲精品国产精品国产自| 欧美激情国产精品| 欧美亚洲一区在线| 热久久视久久精品18亚洲精品| 久久成年人免费电影| 国产欧美日韩中文字幕在线| 成人午夜在线影院| 亚洲黄页网在线观看| 日韩欧美一区视频| 国产精品人成电影| 亚洲小视频在线| 精品国产一区二区三区四区在线观看| 久久精品国产96久久久香蕉| 久久精品国产亚洲精品2020| 国产日韩一区在线| 精品偷拍各种wc美女嘘嘘| 中文字幕精品久久久久| 91在线观看免费高清完整版在线观看| 91精品久久久久久久久久入口| 欧美日韩国产在线| 久久久久久久久久久av| 国产精品自拍偷拍| 欧美黄色免费网站| 91av视频在线观看| 亚洲国产天堂久久国产91| 国产欧美一区二区白浆黑人| 国产日韩欧美黄色| 在线免费观看羞羞视频一区二区| 久久久久久国产精品久久| 日韩在线中文字| 日韩电影大全免费观看2023年上| 亚洲a∨日韩av高清在线观看| 精品国产乱码久久久久酒店| 欧美激情一区二区三级高清视频| 57pao成人国产永久免费| 91高潮精品免费porn| 欧美三级欧美成人高清www| 亚洲精品国产成人| 国产精品久久电影观看| 伊人久久男人天堂| 国产精品久久久久久av下载红粉| 91高清视频免费| 亚洲第一国产精品| 国产日韩中文字幕在线| 色哟哟亚洲精品一区二区| 亚洲国产精品人人爽夜夜爽| 亚州国产精品久久久|