色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

JavaScript異步編程之Promise的初步使用詳解

瀏覽:13日期:2023-06-06 11:29:28
1. 概述

Promise對(duì)象是ES6提出的的異步編程的規(guī)范。說(shuō)到異步編程,就不得不說(shuō)說(shuō)同步和異步這兩個(gè)概念。

從字面意思理解同步編程的話,似乎指的是兩個(gè)任務(wù)同步運(yùn)行,如果這樣理解就錯(cuò)了(至少筆者再?zèng)]有接觸到這個(gè)概念的時(shí)候有這種誤解)。同步和異步指的是代碼指定執(zhí)行的順序(結(jié)構(gòu)化編程范式的執(zhí)行順序總是由上至下,由前往后的),如果執(zhí)行的順序與代碼的相同,就是同步;如果不同,就是異步。

最初,操作系統(tǒng)都是基于命令行的,所有的的語(yǔ)言設(shè)計(jì)出來(lái)也天然是同步的語(yǔ)句,在這種情況下,也不需要異步編程。但是很快,圖形操作界面就出來(lái)了,所有的程序設(shè)計(jì)語(yǔ)言都不得不跟GUI打交道了。我們必須了解的是,GUI程序是一個(gè)不停繪制的界面程序:

while(done){ dosomething(); drawGUI();}

如果每個(gè)循環(huán)中執(zhí)行的任務(wù)dosomething()的事件太長(zhǎng),就會(huì)導(dǎo)致界面遲遲得不到繪制命令,直觀的表現(xiàn)就是卡頓。為了解決這個(gè)問(wèn)題,使用JavaScript作為腳本的瀏覽器一般都會(huì)采用事件循環(huán)(Event Loop)的機(jī)制:

將耗時(shí)的行為規(guī)定為事件,事件與響應(yīng)回調(diào)函數(shù)綁定。 每個(gè)循環(huán),優(yōu)先處理同步代碼。 同步代碼完成,按照先后順序遍歷事件。 在剩下的沒(méi)有同步代碼的循環(huán)中,依次執(zhí)行事件的相應(yīng)函數(shù)。

這樣,在單線程的情況下,就修改了任務(wù)的執(zhí)行順序,實(shí)現(xiàn)了異步的機(jī)制。因?yàn)橥降男袨榭偸呛芸焱瓿杉皶r(shí)進(jìn)行了界面繪制,界面卡頓的現(xiàn)象也大為改善了。

事件循環(huán)機(jī)制將UI設(shè)備的輸入輸出規(guī)定為事件,實(shí)際上,耗時(shí)的行為非常多,但是一般都與IO相關(guān),與IO相關(guān)的行為,JavaScript都提供了異步行為的代碼。例如,這里要用的一個(gè)加載圖片的實(shí)例。

2. 詳論

首先準(zhǔn)備一個(gè)HTML頁(yè)面PromiseTest.html,在這個(gè)HTML頁(yè)面中加載JS的腳本PromiseTest.js:

<!DOCTYPE html><html><head> <meta charset='utf-8'> <script src='http://m.lshqa.cn/bcjs/3rdParty/jquery-3.5.1.js'></script> <title>樣例</title></head><body> <div id = 'container'> </div> <script src='http://m.lshqa.cn/bcjs/PromiseTest.js'></script></body></html>

原生的JS的圖像對(duì)象Image,是通過(guò)事件的形式來(lái)實(shí)現(xiàn)圖像的異步加載的:

$(function () {var img = new Image(); img.onload = function () { $(img).appendTo($(’#container’)); }; img.src = 'http://m.lshqa.cn/bcjs/img.jpg'; });

為Image的事件句柄onload,添加一個(gè)相應(yīng)函數(shù),當(dāng)圖像裝載完成之后,就將裝載好的Image添加到HTML頁(yè)面的某個(gè)div元素子節(jié)點(diǎn)下。通過(guò)瀏覽器打開(kāi)這個(gè)頁(yè)面,會(huì)直接顯示對(duì)應(yīng)地址的圖片。

這個(gè)JS腳本當(dāng)然也可以通過(guò)Promise來(lái)改寫(xiě):

$(function () {function getImg(uri){return new Promise(function(resolve, reject){ var img = new Image(); img.onload = function () {resolve(img); }; img.onerror = function () {reject(Error('Load Image Error!')); } img.src = uri;}); } var imgUri = './img.jpg'; getImg(imgUri).then(function(img){$(img).appendTo($(’#container’)); }, function(error){console.error('Failed!', error); })});

粗看起來(lái),使用Promise,似乎使得程序顯得更加復(fù)雜和繁復(fù)了。但是我們要深入理解Promise機(jī)制的內(nèi)涵,這樣設(shè)計(jì)并不是為了好玩。

Promise對(duì)象代表的是一個(gè)預(yù)定要做、但是還未開(kāi)始做的行為。既然是一個(gè)行為,當(dāng)然得進(jìn)行計(jì)劃,并對(duì)行為結(jié)果做出規(guī)定:如果成功了,就執(zhí)行resolve;如果失敗了,就執(zhí)行reject。一般我們可以定義一個(gè)function,并且返回一個(gè)Promise對(duì)象。 調(diào)用返回Promise對(duì)象的function,這樣這個(gè)想要進(jìn)行的行為就真正啟動(dòng)了。不過(guò)resolve和reject只是兩個(gè)回調(diào)函數(shù),那么就通過(guò)then方法來(lái)規(guī)定成功和失敗對(duì)應(yīng)的真正的處理函數(shù)。

可以看到,這樣的設(shè)計(jì)看起來(lái)很繁復(fù),但是卻很像是一個(gè)同步行為:規(guī)定一個(gè)未完成行為對(duì)象,行為完成了如何處理,行為失敗了又如何處理。而這也是Promise的目的:使得異步操作更像是一個(gè)同步的行為。

3. 參考

同步(Synchronous)和異步(Asynchronous)

簡(jiǎn)述JS單線程異步實(shí)現(xiàn)原理

JavaScript 運(yùn)行機(jī)制詳解:再談Event Loop

到此這篇關(guān)于JavaScript異步編程之Promise的初步使用的文章就介紹到這了,更多相關(guān)js Promise使用內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: JavaScript
相關(guān)文章:
主站蜘蛛池模板: 天天做天天爱夜夜大爽完整 | 日本人的色道www免费一区 | 一级片免费在线播放 | 伊人久久青草青青综合 | 日本黄色大片在线播放视频免费观看 | 午夜毛片免费观看视频 | 国产免费爱在线观看视频 | 夜色精品国产一区二区 | 国产成人毛片视频不卡在线 | 中文字幕乱码中文乱码51精品 | 制服丝袜在线视频香蕉 | 亚洲精品99久久久久久 | 免费黄色网址在线播放 | 中文字幕在线日韩 | 亚洲一区视频在线 | 成人香蕉xxxxxxx | 欧美激情一区二区三区高清视频 | 美女被男人桶到嗷嗷叫爽网站 | 手机日韩理论片在线播放 | 小明台湾成人永久免费看看 | 国产高清免费影视在线观看 | 在线视频一区二区 | 欧美一级一级片 | 九九视频在线免费观看 | 亚洲国产成人久久精品图片 | 一级做a爰片性色毛片男 | 露脸国产野战最新在线视频 | 亚洲美女高清aⅴ视频免费 亚洲美女黄色片 | 99国产精品高清一区二区二区 | 国内精品久久久久久野外 | 亚洲精品自产拍在线观看 | 2019在线亚洲成年视频网站 | 精品视频在线观看一区二区三区 | 在线a国产 | 男人把女人桶到喷白浆的视频 | 在线视频 国产交换 | 国产精品欧美日韩一区二区 | 视频一区在线观看 | 亚洲欧美精品网站在线观看 | 香港经典a毛片免费观看看 香港经典a毛片免费观看爽爽影院 | 黄色一级网址 |