av素人天堂_free性亚洲_久久亚洲国产视频_国产网红在线_午夜av在线播放_欧美成人精品福利网站_热99在线观看_国产在线观看免费麻豆_日本高清在线观看_亚洲免费网站观看视频

ES6中的異步詳解

眾所周知JS是單線程的,這種設(shè)計(jì)讓JS避免了多線程的各種問題,但同時也讓JS同一時刻只能執(zhí)行一個任務(wù),若這個任務(wù)執(zhí)行時間很長的話(如死循環(huán)),會導(dǎo)致JS直接卡死,在瀏覽器中的表現(xiàn)就是頁面無響應(yīng),用戶體驗(yàn)非常之差。

因此,在JS中有兩種任務(wù)執(zhí)行模式:同步(Synchronous)和異步(Asynchronous)。類似函數(shù)調(diào)用、流程控制語句、表達(dá)式計(jì)算等就是以同步方式運(yùn)行的,而異步主要由setTimeout/setInterval、事件實(shí)現(xiàn)。

傳統(tǒng)的異步實(shí)現(xiàn)

作為一個前端開發(fā)者,無論是瀏覽器端還是Node,相信大家都使用過事件吧,通過事件肯定就能想到回調(diào)函數(shù),它就是實(shí)現(xiàn)異步最常用、最傳統(tǒng)的方式。

不過要注意,不要以為回調(diào)函數(shù)就都是異步的,如ES5的數(shù)組方法Array.prototype.forEach((ele) => {})等等,它們也是同步執(zhí)行的?;卣{(diào)函數(shù)只是一種處理異步的方式,屬于函數(shù)式編程中高階函數(shù)的一種,并不只在處理異步問題中使用。

舉個栗子?:

// 最常見的ajax回調(diào)
this.ajax('/path/to/api', {
    params: params
}, (res) => {
    // do something...
})

你可能覺得這樣并沒有什么不妥,但是若有多個ajax或者異步操作需要依次完成呢?

this.ajax('/path/to/api', {
    params: params
}, (res) => {
    // do something...
    this.ajax('/path/to/api', {
      params: params
    }, (res) => {
        // do something...
        this.ajax('/path/to/api', {
          params: params
        }, (res) => {
          // do something...
        })
        ...
    })
})

回調(diào)地獄就出現(xiàn)了。。。?

為了解決這個問題,社區(qū)中提出了Promise方案,并且該方案在ES6中被標(biāo)準(zhǔn)化,如今已廣泛使用。

Promise

使用Promise的好處就是讓開發(fā)者遠(yuǎn)離了回調(diào)地獄的困擾,它具有如下特點(diǎn):

  1. 對象的狀態(tài)不受外界影響:
    • Promise對象代表一個異步操作,有三種狀態(tài):Pending(進(jìn)行中)、Resolved(已完成,又稱 Fulfilled)和Rejected(已失?。?/li>
    • 只有異步操作的結(jié)果,可以決定當(dāng)前是哪一種狀態(tài),任何其他操作都無法改變這個狀態(tài)。
  2. 一旦狀態(tài)改變,就不會再變,任何時候都可以得到這個結(jié)果。
    • Promise對象的狀態(tài)改變,只有兩種可能:從Pending變?yōu)镽esolved和從Pending變?yōu)镽ejected。
    • 只要這兩種情況發(fā)生,狀態(tài)就凝固了,不會再變了,會一直保持這個結(jié)果。
    • 如果改變已經(jīng)發(fā)生了,你再對Promise對象添加回調(diào)函數(shù),也會立即得到這個結(jié)果。
    • 這與事件(Event)完全不同,事件的特點(diǎn)是,如果你錯過了它,再去監(jiān)聽,是得不到結(jié)果的。
  3. 一旦聲明Promise對象(new Promise或Promise.resolve等),就會立即執(zhí)行它的函數(shù)參數(shù),若不是函數(shù)參數(shù)則不會執(zhí)行
this.ajax('/path/to/api', {
    params: params
}).then((res) => {
    // do something...
    return this.ajax('/path/to/api', {
        params: params
    })
}).then((res) => {
    // do something...
    return this.ajax('/path/to/api', {
        params: params
    })
})
...

看起來就直觀多了,就像一個鏈條一樣將多個操作依次串了起來,再也不用擔(dān)心回調(diào)了~?

同時Promise還有許多其他API,如Promise.all、Promise.race、Promise.resolve/reject等等(可以參考阮老師的文章),在需要的時候配合使用都是極好的。

API無需多說,不過這里我總結(jié)了一下自己之前使用Promise踩到的坑以及我對Promise理解不夠透徹的地方,希望也能幫助大家更好地使用Promise:

1.then的返回結(jié)果:我之前天真的以為then要想鏈?zhǔn)秸{(diào)用,必須要手動返回一個新的Promise才行

Promise.resolve('first promise')
.then((data) => {
    // return Promise.resolve('next promise')
    // 實(shí)際上兩種返回是一樣的
    return 'next promise'
})
.then((data) => {
    console.log(data)
})

總結(jié)如下:

  • 如果then方法中返回了一個值,那么返回一個“新的”resolved的Promise,并且resolve回調(diào)函數(shù)的參數(shù)值是這個值
  • 如果then方法中拋出了一個異常,那么返回一個“新的”rejected狀態(tài)的Promise
  • 如果then方法返回了一個未知狀態(tài)(pending)的Promise新實(shí)例,那么返回的新Promise就是未知狀態(tài)
  • 如果then方法沒有返回值時,那么會返回一個“新的”resolved的Promise,但resolve回調(diào)函數(shù)沒有參數(shù)

2.一個Promise可設(shè)置多個then回調(diào),會按定義順序執(zhí)行,如下

const p = new Promise((res) => {
  res('hahaha')
})
p.then(console.log)
p.then(console.warn)

這種方式與鏈?zhǔn)秸{(diào)用不要搞混,鏈?zhǔn)秸{(diào)用實(shí)際上是then方法返回了新的Promise,而不是原有的,可以驗(yàn)證一下:

const p1 = Promise.resolve(123)
const p2 = p1.then(() => {
    console.log(p1 === p2)
    // false
})

3.thencatch返回的值不能是當(dāng)前promise本身,否則會造成死循環(huán)

const promise = Promise.resolve()
.then(() => {
    return promise
})

4.then或者catch的參數(shù)期望是函數(shù),傳入非函數(shù)則會發(fā)生值穿透

Promise.resolve(1)
  .then(2)
  .then(Promise.resolve(3))
  .then(console.log)
// 1

5.process.nextTickpromise.then都屬于microtask,而setImmediate、setTimeout屬于macrotask

process.nextTick(() => {
  console.log('nextTick')
})
Promise.resolve()
  .then(() => {
    console.log('then')
  })
setImmediate(() => {
  console.log('setImmediate')
})
console.log('end')
// end nextTick then setImmediate

有關(guān)microtaskmacrotask可以看這篇文章,講得很細(xì)致。

但Promise也存在弊端,那就是若步驟很多的話,需要寫一大串.then(),盡管步驟清晰,但是對于我們這些追求極致優(yōu)雅的前端開發(fā)者來說,代碼全都是Promise的API(then、catch),操作的語義太抽象,還是讓人不夠滿意呀~

Generator

Generator是ES6規(guī)范中對協(xié)程的實(shí)現(xiàn),但目前大多被用于異步模擬同步上了。

執(zhí)行它會返回一個遍歷器對象,而每次調(diào)用next方法則將函數(shù)執(zhí)行到下一個yield的位置,若沒有則執(zhí)行到return或末尾。

依舊是不再贅述API,對它還不了解的可以查閱阮老師的文章。

通過Generator實(shí)現(xiàn)異步:

function* main() {
   const res = yield getData()
   console.log(res)
}
// 異步方法
function getData() {
   setTimeout(() => {
       it.next({
           name: 'yuanye',
           age: 22
       })
   }, 2000)
}
const it = main()
it.next()

先不管下面的next方法,單看main方法中,getData模擬的異步操作已經(jīng)看起來很像同步了。但是追求完美的我們肯定是無法忍受每次還要手動調(diào)用next方法來繼續(xù)執(zhí)行流程的,為此TJ大神為社區(qū)貢獻(xiàn)了co模塊來自動化執(zhí)行Generator,它的實(shí)現(xiàn)原理非常巧妙,源碼只有短短的200多行,感興趣可以去研究下。

const co = require('co')

co(function* () {
  const res1 = yield ['step-1']
  console.log(res1)
  // 若yield后面返回的是promise,則會等待它resolved后繼續(xù)執(zhí)行之后的流程
  const res2 = yield new Promise((res) => {
    setTimeout(() => {
      res('step-2')
    }, 2500)
  })
  console.log(res2)
  return 'end'
}).then((data) => {
  console.log('end: ' + data)
})

這樣就讓異步的流程完全以同步的方式展示出來啦?~

Async/Await

ES7標(biāo)準(zhǔn)中引入的async函數(shù),是對js異步解決方案的進(jìn)一步完善,它有如下特點(diǎn):

  1. 內(nèi)置執(zhí)行器:不用像generator那樣反復(fù)調(diào)用next方法,或者使用co模塊,調(diào)用即會自動執(zhí)行,并返回結(jié)果
  2. 返回Promise:generator返回的是iterator對象,因此還不能直接用then來指定回調(diào)
  3. await更友好:相比co模塊約定的generator的yield后面只能跟promise或thunk函數(shù)或者對象及數(shù)組,await后面既可以是promise也可以是任意類型的值(Object、Number、Array,甚至Error等等,不過此時等同于同步操作)

進(jìn)一步說,async函數(shù)完全可以看作多個異步操作,包裝成的一個Promise對象,而await命令就是內(nèi)部then命令的語法糖。

改寫后代碼如下:

async function testAsync() {
  const res1 = await new Promise((res) => {
    setTimeout(() => {
      res('step-1')
    }, 2000)
  })
  console.log(res1)
  const res2 = await Promise.resolve('step-2')
  console.log(res2)
  const res3 = await new Promise((res) => {
    setTimeout(() => {
      res('step-3')
    }, 2000)
  })
  console.log(res3)
  return [res1, res2, res3, 'end']
}

testAsync().then((data) => {
  console.log(data)
})

這樣不僅語義還是流程都非常清晰,即便是不熟悉業(yè)務(wù)的開發(fā)者也能一眼看出哪里是異步操作。

總結(jié)

本文匯總了當(dāng)前主流的JS異步解決方案,其實(shí)沒有哪一種方法最好或不好,都是在不同的場景下能發(fā)揮出不同的優(yōu)勢。而且目前都是Promise與其他兩個方案配合使用的,所以不存在你只學(xué)會async/await或者generator就可以玩轉(zhuǎn)異步。沒準(zhǔn)以后又會出現(xiàn)一個新的方案,將已有的這幾種方案顛覆呢 ~

說實(shí)話,學(xué)過后端的人玩JavaScript會陷入一種困境,如果讓程序員自己處理可能會更符合邏輯,比如引入線程之類的,不過優(yōu)化起來又是一個問題了。。。

來源:https://blog.markeyme.cn/2018/06/09/ES6%E5%BC%82%E6%AD%A5%E6%96%B9%E5%BC%8F%E5%85%A8%E9%9D%A2%E8%A7%A3%E6%9E%90/

上一篇 FancyBox3 中文文檔
下一篇 JavaScript中函數(shù)后面打星號方式聲明
目錄
applek

applek管理員

個人說明在個人中心里面設(shè)置

本月創(chuàng)作熱力圖

最新評論
chinacnd
chinacnd
6月26日
這個主題是怎么做到加載速度那么快的?
風(fēng)起云涌
風(fēng)起云涌
6月17日
前臺投稿現(xiàn)在有點(diǎn)太抽象了 希望可以弄成那種分區(qū)填寫的 標(biāo)題,內(nèi)容,圖片,目錄,標(biāo)簽,這樣的
評論于留言建議
風(fēng)起云涌
風(fēng)起云涌
6月17日
希望加個開關(guān)去掉頁腳的站點(diǎn)身份,還有自定義頁腳居中文字
評論于留言建議
卡卡
卡卡
5月31日
倒是放個演示地址啊
av素人天堂_free性亚洲_久久亚洲国产视频_国产网红在线_午夜av在线播放_欧美成人精品福利网站_热99在线观看_国产在线观看免费麻豆_日本高清在线观看_亚洲免费网站观看视频
日韩欧美亚洲视频| 中文字幕久精品免费视频| 欧美日韩视频在线| 国产一级在线| 欧美在线视频一区二区| 欧美日韩久久不卡| 精品在线99| 精品视频—区二区三区免费| 日韩wumaV| 日韩精品不卡一区二区| 久久精品卡一| 日韩精品三级| 国产成人精品免费在线| 欧美国产三级| 亚洲一区精品在线| 婷婷中文字幕一区三区| 亚洲一区视频在线观看视频| 国产黄色高清在线| 午夜伦欧美伦电影理论片| 国产成人精品综合久久久| 国产欧美久久久精品免费| 午夜亚洲福利| 欧美三级三级三级爽爽爽| av亚洲免费| 在线精品视频免费播放| 在线不卡日本| 久久91精品国产91久久小草| 欧美日韩三级在线| 欧美 日韩 国产在线| 一本一道久久a久久精品综合蜜臀| 久久精品国产91精品亚洲| 亚洲图片小说综合| 欧美三级日韩三级国产三级| 亚洲天堂视频一区| 中文字幕在线观看网址| 国产午夜精品久久| 欧美三级视频在线| 国产www.大片在线| 91久久久久久久久| 日韩中文字幕视频在线观看| 精品国产乱码久久久久久牛牛| 欧美啪啪一区| 蜜桃久久av| 欧美日韩在线视频免费观看| 日韩免费精品| 中文字幕在线看精品乱码| 人人做人人澡人人爽欧美| 一二三区精品视频| 中文字幕2020第一页| 亚洲欧美中文字幕| 久久视频在线免费观看| 日韩精品首页| 欧美日韩国产高清| 在线综合 亚洲 欧美中文字幕| 中文字幕在线看精品乱码| 日韩欧美国产网站| 国产一区三区三区| 欧美日韩中文另类| 一级片免费在线| 在线视频一区二区三区在线播放| 亚洲视频 中文字幕| 日韩精品欧美在线| 国产三级做爰在线观看| 粉嫩喷白浆久久| 日韩欧美一级二级三级久久久| 国产欧美日韩亚洲| 亚洲一区二区三区精品中文字幕| 日韩 国产 一区| www.久久草| 在线观看区一区二| 国产乱国产乱300精品| 免费视频国产一区| av中文资源在线| 国产欧美久久久精品影院| 精品福利一区二区三区| 国产午夜精品视频| 国产一区日韩欧美| 精品久久香蕉国产线看观看gif| 欧美亚洲综合视频| 免费一级欧美在线观看视频| 精品av中文字幕在线毛片| 日韩亚洲欧美中文高清在线| 精品国产91| 国产黄色一级片| 欧美 日韩 中文字幕| 一区二区三区精品久久久| 国内不卡的二区三区中文字幕| 国产亚洲一级| 亚洲视频资源在线| 阿v免费在线观看| 91xxx在线观看| 日本一欧美一欧美一亚洲视频| 亚洲高清免费一级二级三级| 欧美在线观看视频一区| 中文字幕亚洲一区二区av在线| 欧美一级搡bbbb搡bbbb| 久久精品一级爱片| 日韩欧美国产成人精品免费| 国产小视频在线观看| 欧美日韩午夜精品| 日韩视频 中文字幕| 亚洲精华国产欧美| 午夜国产欧美理论在线播放| 欧美 日韩 国产 高清| 欧美三级三级三级爽爽爽| 国产成人中文字幕| 午夜国产福利在线观看| 精品一性一色一乱农村| 97视频在线| 国产欧美日韩亚州综合| 亚洲v中文字幕| 欧美日韩午夜精品| 91精品国产乱码久久蜜臀| 亚洲黄页一区| 欧美日韩国产中文| 粉嫩喷白浆久久| 亚洲国产无线乱码在线观看| 欧美日韩亚州综合| 91欧美日韩麻豆精品| 中文网丁香综合网| 日韩欧美中文免费| 91久久久精品国产| 精品久久久久久综合日本欧美| 亚洲影视资源网| 91久久久久久久久| 久草视频在线看| 白嫩少妇丰满一区二区| 99久热re在线精彩视频| 欧美日韩激情在线一区二区三区| 精品国自产在线观看| 日韩在线视频在线观看| 日韩精品在线视频观看| 久久精品电影| 欧美三级精品| 亚洲一区在线观看视频| 99精品免费观看| 国产福利第一页| 亚洲第一福利视频在线| 亚洲三级国产| 欧美日韩高清一区二区不卡| 国产欧美日韩在线播放| 在线国产一级| 国产综合成人久久大片91| 中文字幕日韩在线观看| 亚洲a级在线播放观看| 精品视频1区2区3区| 国产区视频在线观看| 日韩视频精品| 国产成人精品网址| 一区二区日韩免费看| 国产不卡视频在线| 国产成人精品三级| 欧美日韩色综合| 中文字幕日韩视频| 亚洲人线精品午夜| 99久久婷婷| 日韩在线一区二区视频| 日韩免费看网站| 日韩av不卡在线观看| 日韩在线中文字幕| 日韩中文字幕在线播放| 国产99在线 | 亚洲| 日韩欧美一级视频| 久久永久免费视频| 在线视频色在线| 91久久久精品| 一级特黄大欧美久久久| 麻豆精品99| av中文天堂在线| 精品欧美日韩在线| 被陌生人带去卫生间啪到腿软| 国产一区不卡在线| 999精品视频在线观看播放| 中文av字幕一区| 日韩视频在线观看视频| 国产在线观看黄色| 91精品国产综合久久香蕉的特点| 久久久久久99精品| 天堂在线中文| 欧美日韩国产首页| 亚洲一区日韩精品中文字幕| 日本不卡视频一区| 欧美日韩国产三级| 91精品国产综合久久久久久| 欧美日韩亚洲综合| av手机天堂| 国产欧美日韩中文字幕| 亚洲一级影院| 美女免费视频一区| 一区二区不卡在线播放| 91亚洲国产高清| 欧美日韩国产成人| 日韩免费视频| 成人a在线视频免费观看| 亚洲专区一二三| 美女黄a一级视频| 97caopor国产在线视频| 精品日韩一区二区三区免费视频| 欧美日韩中文字幕在线观看| 91久久久久| 日韩激情一区| 欧美亚洲专区| 在线观看一区| 午夜精品一区二区三区免费视频| 国产色在线视频| 精品国产乱码一区二区| 一区二区三区免费看视频| 一级国产黄色片| 中文字幕在线观看视频www| 91精品免费在线观看| 国产午夜精品一区二区三区视频| 中文字幕不卡三区| 亚洲一区在线观看免费| 日本精品专区| 欧美日韩一区二区在线视频| 在线观看国产一级片| 在线日韩欧美| 日本黄色一区二区三区| 中文字幕在线播出| 精品1区2区3区| aaa欧美日韩| 在线一区二区不卡| av免费观看网站| 黄色片免费看| 婷婷中文字幕一区| 欧美日韩精品欧美日韩精品一| 人人做人人澡人人爽欧美| 久久精品最新免费国产成人| 欧美婷婷久久| 日韩精品手机在线| 中文字幕欧美日韩精品| 欧美日韩一区二区在线视频| 国产欧美久久久久久久久| 欧美国产日韩综合| 91精品国产亚洲| 亚洲一区在线观看视频| 欧美三级三级三级爽爽爽| 国产在线中文字幕| 亚洲一区中文字幕在线观看| 欧美一级欧美三级在线观看| 久久综合久久综合九色| 91久久久久久久久| 国产黄色一级片| 亚洲欧洲综合另类| 欧美高清视频一区二区三区| www.日韩免费| 区日韩二区欧美三区| 欧美日韩在线国产| 亚洲国产专区| 一本一道综合狠狠老| 91色在线看| 黄色在线资源| 亚洲永久免费视频| 91精品久久久久久久久| 亚洲丝袜一区| 欧美日韩中文国产| 亚洲视频在线观看三级| 日韩欧美综合视频| 亚洲三级中文字幕| 亚洲第一中文字幕在线观看| 中文字幕日韩欧美| 国产婷婷色一区二区三区| 欧美日韩中文字幕视频| 亚洲第一视频网站| 国产高清大尺度一区二区不卡| 精品亚洲成a人片在线观看| 日韩三级视频在线看| 91亚洲欧美| 高清一区二区| 精品久久久网| 日韩一级视频在线观看| 精品午夜av| 精品视频资源站| 日韩精品综合在线| 欧美亚洲国产免费| 国产欧美日韩视频| 国产中文在线观看| 日韩中文字幕综合| 激情久久99| 国产视频三级在线观看播放| 色综合久久六月婷婷中文字幕| 不卡福利视频| 首页国产欧美久久| 99国产成 人 综合 亚洲欧美| 中文国产字幕在线观看| 日本黄色一区二区三区| 欧美日韩亚洲综合在线| 亚洲午夜久久| 国产亚洲二区| 在线视频色在线| 国产羞羞视频在线播放| 国产视频中文字幕在线观看| 在线视频国产三级| 不卡中文一二三区| 日韩在线中文字幕| 亚洲福利在线视频| 欧美日韩国产免费观看视频| 久久中文免费视频| 欧美三级视频在线| 欧美国产91| 国产在线黄色| 一区二区不卡在线| 国产在线导航| 亚洲精品欧美二区三区中文字幕| 国产不卡在线观看视频| 九九九精品视频| 日韩免费视频一区二区视频在线观看| 国产在线不卡一区| 日韩精品中文字幕第1页| a√免费观看在线网址www| 日韩你懂的电影在线观看| 福利一区二区| 日韩在线视频观看正片免费网站| 中文字幕日韩高清| 欧美三级中文字幕在线观看| 日韩欧美国产三级| 亚洲男女av一区二区| 精品欧美日韩| 亚洲天堂视频一区| 国产乱码在线观看| 中文字幕日韩第一页| 日本精品在线中文字幕| 欧美日韩亚州综合| 五月天久久比比资源色| 久久久91精品| 91精品婷婷国产综合久久| av一区在线| 日韩欧美看国产| 欧美日韩午夜在线视频| 91精品国产自产在线观看永久∴| 亚洲国产福利| 国产在线不卡一区| 中文字幕狠狠干| 中文字幕在线中文字幕二区| 日韩一级中文字幕| 中文字幕在线观看播放| 国产高清大尺度一区二区不卡| 午夜精品一区二区三区视频免费看| 日韩欧美中文视频| 亚洲丝袜一区| 欧美日韩中文在线| 欧美1234区| 国产在线视频不卡| 91精品在线观| 亚洲乱码中文字幕综合| 亚洲一区中文| 91精品国产综合久久久久久| 免费看ww视频网站入口| 日韩欧美在线第一页| 午夜成人鲁丝片午夜精品| 日韩欧美国产网站| 亚洲最大黄色| 91国内精品在线视频| 色妇色综合久久夜夜| 在线国产三级| 成人久久在线| 中文字幕一区免费| 国产黄色片中文字幕| 日韩欧美中文字幕在线视频| 91精品在线国产| 日韩欧美在线综合| 亚洲一区视频在线观看视频| 日韩精品一二三四区| 亚洲欧美久久久| 亚洲女人天堂a在线播放| 精品国内自产拍在线视频| 日韩欧美国产成人精品免费| 蜜桃久久av一区| 精品一区二区三区中文字幕| 精品欧美不卡一区二区在线观看| 精品久久91| 中文字幕综合在线| 日韩欧美一二三| 日韩在线观看精品| 一区二区三区精品在线| 亚洲一区在线观看视频| 日韩精品免费视频一区二区三区| 在线中文字幕视频| 亚洲综合在线视频| 成人久久久久| 亚洲一区在线观看视频| 欧美 日韩 中文字幕| 精品国内自产拍在线视频| 国产嫩草影院久久久久| 91麻豆视频网站| 亚洲一区中文字幕在线观看| 91久久视频| www中文字幕在线观看| 欧美日韩中文| 国产精品福利视频一区二区三区| 亚洲免费专区| 拍真实国产伦偷精品| 免费在线视频一级不卡| 一级片免费网站| av中文天堂在线| 欧美日韩国产区| 日韩不卡高清视频| 国内不卡的二区三区中文字幕| www..com日韩| 日韩亚洲国产欧美|