成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

async & await & promise

Dean / 3382人閱讀

摘要:最近項(xiàng)目中用的比較多,所以特地去了解,模仿一下實(shí)現(xiàn)先來(lái)看看使用的方法通過(guò)是通過(guò)使用生成器配合方法模擬的一個(gè)同步操作,這個(gè)技術(shù)有效的避免了傳統(tǒng)回調(diào)和形成的回調(diào)地獄。

最近項(xiàng)目中 asyn & await 用的比較多,所以特地去了解,模仿一下實(shí)現(xiàn)~

先來(lái)看看 使用 async & await 的方法
async function d () {
  try {
    const a = await Promise((resolve, reject) => {
        setTimeout(reject, 2000 + Math.random() * 3000)
        setTimeout(resolve, 2000 + Math.random() * 3000)
    })
    console.log(a)
  } catch (e) {
    console.log(e)
  }
}

d()

通過(guò) async 是通過(guò)使用生成器配合yield方法模擬的一個(gè)同步JS操作,這個(gè)技術(shù)有效的避免了傳統(tǒng)回調(diào)和promise形成的回調(diào)地獄~。async必須用在函數(shù)上,使用方法如上。在需要停止的地方加上 await 關(guān)鍵字,結(jié)果會(huì)根據(jù)promise的決議來(lái)決定,如果是resolve那么就會(huì)繼續(xù)執(zhí)行下去,否則會(huì)拋出異常,可以由try & catch捕捉。

下面是模擬async & await 的實(shí)現(xiàn)方法的demo
void function () {
    function *p () {
      try {
        const a = yield new Promise((resolve, reject) => {
          setTimeout(reject, 2000 + Math.random() * 3000)
          setTimeout(resolve, 2000 + Math.random() * 3000)
        })
        if (a instanceof Error) throw a
        console.log("success", a)
      } catch (e) {
        console.log("error ", e)
      }
    }
    // 執(zhí)行 p 生成器
    let c = p()
    // 執(zhí)行 each 遍歷生成器所有 yield
    function each (res) {
      // 執(zhí)行第一個(gè) yield
      const r = c.next(res)
      // 如果還有后續(xù) 等待 then 方法回調(diào)  繼續(xù)執(zhí)行 遍歷
      if (!r.done) {
        r.value.then(res=>{
          each(res)
        }).catch(e=>{
          // 如果報(bào)錯(cuò) 則返回 錯(cuò)誤信息
          each(new Error(e))
        })
      }
    }
    each()
}()

生成器概念請(qǐng)點(diǎn)這里

通過(guò)生成器和promise配合可以在then回調(diào)的時(shí)候繼續(xù)執(zhí)行函數(shù)。c.next()執(zhí)行后在第一個(gè)yield地方停頓并且返回yield后面的Promise,如果返回的done是true則代表函數(shù)執(zhí)行結(jié)束,否則就監(jiān)聽(tīng)then方法回調(diào)。然后遞歸調(diào)用自身一路next直到done為true~

總結(jié)一下

async & await是同步執(zhí)行異步流程的解決方案,這個(gè)方案和Promise是緊密結(jié)合的,是基于Promise的一層封裝。所以配合Promise的方法可以更好的解決異步流程~如果有什么不對(duì)的地方,盼望您能底部留言,感激不盡~

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/95248.html

相關(guān)文章

  • Promise && async/await的理解和用法

    摘要:但是中的這種情況與抽象反應(yīng)器模式如何描述完全不同。在處理一個(gè)階段之后并且在移到下一個(gè)隊(duì)列之前,事件循環(huán)將處理兩個(gè)中間隊(duì)列,直到中間隊(duì)列中沒(méi)有剩余的項(xiàng)目。如果沒(méi)有任務(wù)則循環(huán)退出,每一次隊(duì)列處理都被視為事件循環(huán)的一個(gè)階段。 Promise && async/await的理解和用法 為什么需要promise(承諾)這個(gè)東西 在之前我們處理異步函數(shù)都是用回調(diào)這個(gè)方法,回調(diào)嵌套的時(shí)候會(huì)發(fā)現(xiàn) 閱讀...

    王笑朝 評(píng)論0 收藏0
  • async & await (譯)

    摘要:的出現(xiàn),讓我們可以走出回調(diào)地獄,著實(shí)驚艷。我已經(jīng)開(kāi)始使用里的和關(guān)鍵字來(lái)簡(jiǎn)化的處理。異步任務(wù)在這個(gè)例子是執(zhí)行之后,一直在執(zhí)行完成才繼續(xù)下一個(gè)任務(wù)并沒(méi)有產(chǎn)生阻塞。最后這個(gè)函數(shù)處理了返回值并且返回了一個(gè)對(duì)象。依然很棒,但和使得它可維護(hù)性更好。 JavaScript Promises的出現(xiàn),讓我們可以走出回調(diào)地獄,著實(shí)驚艷。Promises 允許我們更好的引入和處理異步任務(wù),雖然如此,但引入好...

    The question 評(píng)論0 收藏0
  • async/awaitPromise 的用例&關(guān)系

    摘要:和的關(guān)系和的關(guān)系非常的巧妙,必須在內(nèi)使用,并裝飾一個(gè)對(duì)象,返回的也是一個(gè)對(duì)象。的會(huì)使得的代碼節(jié)點(diǎn)自動(dòng)拋出相應(yīng)的異常,終止向下繼續(xù)執(zhí)行。示例方法內(nèi)無(wú)節(jié)點(diǎn)沒(méi)有修飾的方法內(nèi)有節(jié)點(diǎn)注意內(nèi)的對(duì)節(jié)點(diǎn)的作用。 假設(shè)我們有三個(gè)請(qǐng)求,req1,req2, req3,三個(gè)請(qǐng)求后者依賴(lài)前者的請(qǐng)求結(jié)果。我們先使用Promise封裝一個(gè)異步請(qǐng)求的方法。 Promise 異步請(qǐng)求 使用Promise可以非常容易的...

    y1chuan 評(píng)論0 收藏0
  • ES6&ES7中的異步之async函數(shù)

    摘要:更好的語(yǔ)義和分別表示異步和等待,比起和更容易理解。前邊聲明關(guān)鍵字,表示內(nèi)部有內(nèi)部操作,調(diào)用函數(shù)會(huì)返回一個(gè)對(duì)象。等價(jià)于其中函數(shù)就是自動(dòng)執(zhí)行器。 async函數(shù) 定義 async函數(shù)其實(shí)就是之前說(shuō)過(guò)的Generator的語(yǔ)法糖,用于實(shí)現(xiàn)異步操作。它是ES2017的新標(biāo)準(zhǔn)。 讀取兩個(gè)文件: const fs = require(fs) const readFile = function(f...

    dongxiawu 評(píng)論0 收藏0
  • 詳解JS前端并發(fā)多個(gè)相同的請(qǐng)求控制為只發(fā)一個(gè)請(qǐng)求方式

      描述如下  我們要同時(shí)發(fā)多個(gè)相同的請(qǐng)求,第一個(gè)請(qǐng)求成功后,剩余結(jié)果都不會(huì)發(fā)出,返回結(jié)果是成果。  假如第一個(gè)反饋失敗,第二個(gè)是成功,后面就不會(huì)發(fā)出,后面都直接反饋成功。第三個(gè)才是成功的話,后面就不會(huì)在發(fā)出,后面都反饋成功。依次如此處理,直至最后一個(gè)。    并發(fā): 一個(gè)接口請(qǐng)求還處于pending,短時(shí)間內(nèi)就發(fā)送相同的請(qǐng)求  asyncfunctionfetchData(a){   const...

    3403771864 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<