亚洲免费在线视频-亚洲啊v-久久免费精品视频-国产精品va-看片地址-成人在线视频网

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

javascript - 同步方式寫異步到底指什么?

瀏覽:89日期:2023-03-13 08:38:48

問(wèn)題描述

同步不就是同步,異步不就是異步嗎?同步方式寫異步到底指什么?

問(wèn)題解答

回答1:

異步調(diào)用對(duì)于當(dāng)前線程來(lái)說(shuō),是非阻礙的,所以要想知道異步處理是否完成,或者是否出錯(cuò),通常都是通過(guò)事件或回調(diào)來(lái)實(shí)現(xiàn)的,這在 Node.js 比比皆是。Ajax 就是很典型的異步調(diào)用,以 jQuery.ajax 為例

$.getJSON('http://api.youapp.com/resouce1') .done(function(jo) {console.log('api resouce1 返回的是', jo); });

jQuery 的 Ajax 返回的是 jQuery 的 Promise 對(duì)象,一般習(xí)慣上我們會(huì)使用 done() 回調(diào)來(lái)處理調(diào)用完成之后的事情。但實(shí)際它也有標(biāo)準(zhǔn) Promise 的 then(),所以上面的 done 是可以改成 then 的,但是要注意,done 是以事件的形式注冊(cè)回調(diào),它返回當(dāng)前這個(gè) Promise 對(duì)象本身,可以鏈?zhǔn)秸{(diào)用注冊(cè)若干個(gè)回調(diào)。而 then 返回的是另一個(gè) Promise 對(duì)象(標(biāo)準(zhǔn) Promise 規(guī)范),鏈?zhǔn)秸{(diào)用的話,每次調(diào)用并非作用在同一個(gè) Promise 對(duì)象上。

如果在一個(gè)回調(diào)中需要進(jìn)行另一個(gè)異步調(diào)用,就需要在回調(diào)中注冊(cè)另一個(gè)回調(diào)。比如要獲取某個(gè)數(shù)據(jù),需要先從 api1 獲取某個(gè)值,再用這個(gè)值去 api2 獲取某個(gè)資源,再用這個(gè)資源中的某個(gè)值去 api3 獲取這個(gè)值,這樣的回調(diào)寫出來(lái)會(huì)像這樣:

$.getJSON('http://api.youapp.com/resouce1') .then(function(jo) {$.getJSON('http://api.youapp.com/resouce2?id=' + jo.blaId) .then(function(jo2) {$.getJSON('http://api.youapp.com/resouce3?xxx=' + jo2.xxxValue) .then(function(value) {console.log('總算拿到了', value); }); }); });

這才三層……很可怕的形式。這種形式被稱為“回調(diào)地獄”。

大家想了很多辦法來(lái)解決這種問(wèn)題,Promise 就是其一,但是 Promise 仍然不能完全擺脫這種形式。co 庫(kù)也是解決方案之一,同樣不能完美擺脫。

不過(guò) ES2017 引入了 async/await,也就是所謂的以同步的形式寫異步,比如上面那段代碼可以改寫成

async function xxx() { const jo = await $.getJSON('http://api.youapp.com/resouce1'); const jo2 = await $.getJSON('http://api.youapp.com/resouce2?id=' + jo.blaId); const value = await $.getJSON('http://api.youapp.com/resouce3?xxx=' + jo2.xxxValue); console.log('總算拿到了', value);}

async/await 消除了回調(diào),所以看起來(lái)跟寫非異步(即同步)代碼一樣。

參考:

閑談異步調(diào)用“扁平”化

從地獄到天堂,Node 回調(diào)向 async/await 轉(zhuǎn)變

理解 JavaScript 的 async/await

回答2:

異步時(shí)常見(jiàn)回調(diào)函數(shù)嵌套,形如:

// 先讀取 afs.readFile(’a.txt’, (a) => { // a 讀取成功后讀取 b fs.readFile(’b.txt’, (b) => { // b 讀取成功后讀取 c fs.readFile(’c.txt’. (c) => { console.log(a + b + c) }) })})

這時(shí)出現(xiàn)了回調(diào)嵌套,需要一層一層往里套,非常容易出錯(cuò)且不好維護(hù)。

同步方式寫異步類似于:

function * asyncWrapper () { const a = yield read(’a.txt’) const b = yield read(’b.txt’) const c = yield read(’c.txt’) console.log(a + b + c)}// 使用形如 co 的庫(kù)自動(dòng)執(zhí)行異步邏輯co(asyncWrapper)

這時(shí)候異步業(yè)務(wù)邏輯就通過(guò)正常的同步方式實(shí)現(xiàn)了。

回答3:

同步方式寫異步指得是代碼的組織形式而已。使用async/await可以實(shí)現(xiàn)同步方式寫異步,看下面代碼:

const testAsync = async () => { const t = await f(); console.log(t);};testAsync();

f是一個(gè)異步操作,如果不使用async/await,直接同步的方式打印t,結(jié)果肯定是undefined;使用async/await之后,代碼看上去形式還是同步的,但是里面是先執(zhí)行異步操作f,再打印t的

回答4:

樓上兩個(gè)答案足矣

標(biāo)簽: JavaScript
相關(guān)文章:
主站蜘蛛池模板: 1717she国产精品免费视频 | 亚洲精品视 | 久久99国产综合精品 | 91精品久久久久含羞草 | 精品久久久久久久久久久 | 亚洲精品一区二三区在线观看 | 天海翼精品久久中文字幕 | 亚洲人成网站在线在线 | 免费国产a理论片 | 一级毛片视频免费观看 | 一本一道波多野结衣456 | 久久精品国产精品亚洲人人 | 特黄的欧美毛片 | 婷婷尹人香蕉久久天堂 | 看久久久久毛片婷婷色 | 亚洲乱码一二三四五六区 | 久久成年片色大黄全免费网站 | 午夜在线播放免费人成无 | 国产成人免费 | 成年女人黄小视频 | 亚洲视频在线观看 | 嫩模大尺度人体福利视频 | 国产精品毛片无码 | 国产精品久久久久久久久久久威 | 美女又黄又免费 | 免费一区二区三区视频狠狠 | 日韩在线视精品在亚洲 | 一级特黄aa大片欧美 | 欧美日韩精彩视频 | 亚洲国产精品一区二区三区 | 日本在线观看www免费 | 久草视频在线首页 | 亚洲国产成人九九综合 | 男人都懂的网址在线看片 | 在线国产一区 | 国产日韩一区二区三区在线观看 | se94se最新网站 | 亚洲一片 | 久久精品国产一区二区三区不卡 | 国产呦系列呦交 | 国产一级久久免费特黄 |