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| 日韩在线一区二区| 亚洲视频 中文字幕| 中文字幕在线看精品乱码| 你懂的亚洲视频| 久本草在线中文字幕亚洲欧美| 国产资源在线观看入口av| 中文字幕4区| 亚洲va久久久噜噜噜久久| 一区二区高清视频| 国产三级视频在线播放线观看| 91精品国产入口| 日韩不卡一区二区| 在线国产三级| 日韩精品在线免费观看视频| 亚洲免费看av| 欧美日韩免费不卡视频一区二区三区| av亚洲免费| 国产欧亚日韩视频| 午夜精品一区二区三区视频免费看| 日韩国产高清一区| 日本免费看黄| 欧美三级日韩三级国产三级| 一区二区三区久久| 伊人伊成久久人综合网小说| 日韩在线观看一区| 色妇色综合久久夜夜| 视频一区视频二区中文| 日韩视频 中文字幕| 国产三级精品网站| 国产一区 二区 三区一级| 日韩欧美亚洲区| 日韩在线观看视频一区二区| 日韩欧美中文字幕在线观看| 日韩精品高清不卡| 国产乱国产乱老熟300| 中文字幕第一页在线播放| www.91香蕉视频| 久久精品一二三| 日韩欧美一级二级三级久久久| 中文字幕欧美在线| 久久91精品视频| 日韩精品中文在线观看| 欧美 日韩 国产 在线观看| 日本国产在线视频| 日韩国产欧美| 国产福利在线导航| 一区二区三区在线播放欧美| 国产网站欧美日韩免费精品在线观看| 日韩在线视频免费观看| 午夜国产视频| 中文字幕狠狠干| 国产黄在线观看免费观看不卡| 欧美日韩久久不卡| 欧美日韩中文字幕在线观看| 国产欧美综合在线观看第十页| 日韩a一区二区| av一区在线观看| 欧美一卡2卡三卡4卡5免费| 国产精品视频福利一区二区| 久久久另类综合| 黄色一级大片在线免费看国产一| 国产欧美日韩在线观看| 日韩欧美在线视频日韩欧美在线视频| 中文亚洲欧美| 国产三级精品网站| 午夜成人鲁丝片午夜精品| 欧美中文字幕第一页| 亚洲一区中文字幕在线观看| 亚洲尤物av| 精品日韩av一区二区| 久久激情中文| 欧美一级久久久久久久久大| 欧美久久一二三四区| 二区中文字幕| 一区二区三区在线|网站| 精品婷婷伊人一区三区三| 久久久久久99精品| 亚洲一区精品在线| 国产调教精品| 国产欧美日韩三级| 日韩精品大片| 99精品电影| 欧美 日韩 国产 在线| 国产免费永久在线观看| 国产永久免费高清在线观看| 久久久精品国产99久久精品芒果| 婷婷中文字幕综合| 亚洲欧洲一区二区天堂久久| 91精品国产高清久久久久久| 日韩免费精品视频| 成人无遮挡免费网站视频在线观看| 91精品国产综合久久久久久| 国产黄色片中文字幕| 欧美日韩在线播放三区四区| 91蜜桃婷婷狠狠久久综合9色| 99日韩精品| 首页国产欧美久久| 在线观看免费国产小视频| 玖玖在线免费视频| 在线中文字幕视频观看| 欧美日韩国产高清视频| 国产久卡久卡久卡久卡视频精品| 色一区在线观看| 日韩精品视频中文在线观看| 亚洲福利在线看| 一区二区在线观| 天堂在线www天堂中文在线| 国产欧美日韩精品综合| 91蜜桃在线视频| 精品国产欧美| 国产99在线|亚洲| av影视在线看| 在线综合 亚洲 欧美中文字幕| 欧美日韩在线视频免费观看| 国产一级片在线| 国产在线观看a| 日韩午夜一区| 一区二区不卡在线播放| 久久久水蜜桃| 亚洲一区视频在线观看视频| 高清一区二区| 欧美日韩中文字幕视频| 亚洲免费婷婷| 中文在线а√在线8| 搞黄在线观看| 黄色片免费在线| 亚洲a级在线播放观看| 日韩在线视频二区| 91精品观看| 久久永久免费视频| 中文字幕在线亚洲| 中文字幕日韩在线观看| 成人无遮挡免费网站视频在线观看| 91精品国产91久久久久久不卡| 欧美日韩一级黄| 亚洲第一中文字幕| 91精品视频在线| 日韩精品首页| 一区二区三区鲁丝不卡| 国产福利第一页| 中文字幕五月欧美| 影音先锋一区二区资源站| 国产在线二区| 91精品婷婷国产综合久久竹菊| 日韩中文字幕久久| 日韩欧美国产成人精品免费| 精品一区二区三区中文字幕在线| 欧美日韩亚洲一| 亚洲乱码中文字幕综合| 91精品国产91综合久久蜜臀| 日韩欧美一级视频| 国产一区在线观看视频| 成人一区而且| 91精品在线观看视频| 日本熟女一区二区| 久久精品欧美日韩精品| 欧美日韩在线视频免费观看| 国产福利免费观看| 国产成人精品免费久久久久| 视频一区二区国产| 中文字幕在线播出| 日韩你懂的电影在线观看| 一本久久a久久精品亚洲| 欧美日中文字幕| 日韩精品在线网站| 中文字幕在线播出| av最新网址| 在线黄色国产电影| 亚洲国产福利| 精品视频三区| 91精品国产手机| 91蜜桃婷婷狠狠久久综合9色| 天天综合天天添夜夜添狠狠添| 中文字幕欧美日韩在线| 中文字幕 亚洲一区| 国产亚洲二区| 国产黄色片中文字幕| 国产欧美久久久精品影院| 二区三区不卡不卡视频| 欧美三级一区二区三区| 国产日韩在线视频| 久久综合九色欧美综合狠狠| 91久久精品网| 一区二区不卡在线播放| 在线不卡日本| 欧美另类久久久品| 91精品在线免费| 亚洲一区视频在线观看视频| 精品一区二区三区中文字幕在线| 亚洲综合在线电影| 日韩视频1区| 日韩中文在线中文网三级| 中文字幕精品视频| 亚洲第一页中文字幕| 日韩欧美在线第一页| 91蜜桃婷婷狠狠久久综合9色| 91av久久久| 久久99精品久久久久子伦| 亚洲免费观看在线观看| 一区二区高清在线| 日韩高清不卡| 国产成人综合精品| 日本精品在线| 欧美不卡视频一区| 91精品国产入口| 日韩精品手机在线观看| 精品熟女一区二区三区| 亚洲综合在线视频| 亚洲最大黄色| 欧美日韩综合不卡| 国产欧美日韩精品高清二区综合区| 亚洲一区在线观看免费| 欧美不卡视频一区| 久久久99久久精品欧美| 顶级网黄在线播放| 精品一区二区三区中文字幕在线| 日韩 欧美 综合| 成人福利一区| 久久精品国产成人一区二区三区| 国产福利三区| 日韩中文在线中文网三级| 快she精品国产999| 中文字幕亚洲区| 狠狠色综合色区| 色国产在线视频| 一区二区视频国产| 欧美一级欧美三级在线观看| 日韩免费电影网站| av免费在线播放| 国产在线一在线二| 国产v日产∨综合v精品视频| 欧美日韩在线视频首页| 日韩三级视频在线| www.老鸭窝.com| 中文字幕在线观看国产| 久久婷婷国产| 一级日韩一级欧美| 最近中文字幕第一页| 国产欧美日韩在线播放| 国产欧美中文字幕| 一区二区视频在线观看免费的| 国产专区中文字幕| 亚洲国产欧美日韩在线| 欧美va亚洲va日韩∨a综合色| 欧美日韩一级视频| 91精品在线观看视频| 日韩欧美一二三四区| 在线视频不卡一区二区| 精品av中文字幕在线毛片| 亚洲中文字幕在线一区| 日韩中文字幕视频网| 亚洲第一中文字幕| 亚洲一卡二卡在线观看| 欧美日韩亚洲系列| 国产欧美日韩亚洲| 精品久久人人做人人爽| 欧美天堂一区二区| 久久精品免费在线观看| 日韩欧美在线网站| 国产区日韩欧美| 日韩精品手机在线观看| 日韩av中文字幕一区| 日韩欧美成人一区二区三区| 一区二区三区久久| 日韩精品中文在线观看| 国产欧美日韩久久| 91精品国产99| 日韩欧美中文在线视频| 国产午夜精品视频| 欧美日韩在线不卡视频| 色偷偷一区二区三区| 国产在线黄色片| 欧美国产中文| 色综合天天综合网国产成人综合天| 日韩精品在线观看网站| 91精品国产综合久久福利| 欧美日韩精品不卡| 日韩精品在线网站| 亚洲二区自拍| 中文亚洲欧美| 国产在成人精品线拍偷自揄拍| 午夜伊人狠狠久久| 精品调教chinesegay| 欧美日韩91| 欧美久久在线观看| 亚洲乱码中文字幕| 欧美日韩免费高清| 日韩欧美三级在线| 国产在线播放一区二区| 日韩欧美成人一区二区三区| 午夜视频在线观看一区| 亚洲综合在线中文字幕| 国产欧美久久久精品影院| 中文字幕国产日韩| 国产91欧美| 不卡一二三区| 亚洲成av人综合在线观看| 国产视频2区| 亚洲欧美中文在线视频| 欧美激情视频一区二区三区在线播放| 欧美wwww| 91精品国产色综合久久不卡蜜臀| 亚洲一区在线观看视频| 国产三级视频在线播放线观看| 日韩在线一区二区| 日韩专区视频网站| 国产三级精品网站| 日韩欧美国产片| 日韩欧美中文字幕一区| 亚洲а∨精品天堂在线| 日韩欧美一级精品久久| 久久久99免费| 婷婷精品进入| 91蜜桃在线视频| 精品视频三区| 精品国产91乱高清在线观看| 欧美日韩国产首页在线观看| 国产欧美日韩精品在线观看| 亚洲va中文字幕| 国产羞羞视频在线播放| 国产不卡的av| 午夜亚洲一区| 日韩精品在线观| 久久福利视频一区二区| 一级国产黄色片| 精品无人国产偷自产在线| 欧美99久久| 国产永久在线观看| 日韩你懂的电影在线观看| 亚洲成年人在线播放| 亚洲乱码一区av黑人高潮| 91精品国产综合久久精品| 欧美日韩亚洲综合| 一区二区国产在线| 91久久精品国产| 欧美二区在线观看| 91精品国产91久久| 亚洲福利精品视频| 欧美 日韩 国产 高清| 91精品久久久久久久久久| 韩国av一区二区| 国产欧美日韩精品综合| 亚洲丝袜一区| 国产羞羞视频在线播放| 国产成人精品免费在线| a在线观看免费视频| 欧美一级免费在线观看| 亚洲.国产.中文慕字在线| www日韩在线观看| 国产小视频在线观看| 一区二区不卡久久精品| 成人无遮挡免费网站视频在线观看| 精品国产欧美日韩| 天堂精品高清1区2区3区| 三级网站免费观看| 国产在线二区| 视频一区二区国产| 日韩视频中文字幕| 一区二区视频在线观看免费的| 日韩精品三级| 91精品国产自产91精品| 国产三级在线观看视频| 日韩国产欧美亚洲| 中文字幕久久精品| 天堂精品高清1区2区3区| 国产香蕉精品视频| 91精品国产手机| 午夜影院在线观看欧美| 欧美日韩一级黄| 在线亚洲人成| 欧美激情一区二区三区在线| 欧美三级中文字幕| 日韩 国产 一区| 精品福利在线观看| 日韩精品视频在线观看网址| 欧美高清视频一区二区三区| 日韩中文字幕在线一区| 亚洲九九精品| 在线欧美日韩国产| 国产一二三视频| 久久中文精品| 中文字幕亚洲区| 亚洲精品中文字幕乱码三区不卡| 婷婷久久综合网| 国产福利一区二区精品秒拍| 日韩欧美国产亚洲| 不卡av免费在线| 中文字幕高清在线播放| 亚洲综合欧美在线| 伊人国产视频| 日本a级黄色| 日韩欧美在线视频日韩欧美在线视频| 日韩欧美99| 久久久99久久精品欧美| 日韩在线视频观看正片免费网站| 91亚洲国产|