最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

ES6記錄異步函數(shù)的執(zhí)行時(shí)間詳解

 更新時(shí)間:2016年08月31日 15:37:05   投稿:daisy  
在這篇文章里,我會(huì)實(shí)現(xiàn)一個(gè)可重用的函數(shù)來處理 JavaScript 延時(shí)異步操作。有需要的小伙伴們可以參考借鑒,下面來一起看看。

calc

calc 是一個(gè)我們想要做剖析(性能分析)的異步函數(shù)。按照慣例,它的最后一個(gè)參數(shù)是一個(gè)callback。我們像這樣使用 calc

calc(arg, (err, res) => console.log(err || res))

或許,最簡單的對(duì) calc 這樣的函數(shù)來剖析性能的方法是,增加一個(gè)計(jì)時(shí)邏輯到我們需要分析的地方:

const t0 = Date.now()
calc(arg, (err, res) => {
 const t1 = Date.now() 
 console.log(`Log: time: ${t1 = t0}`)
 console.log(err || res)
})

但是,這不是一個(gè)可復(fù)用的解決方案。每一次我們想要對(duì)一個(gè)函數(shù)計(jì)時(shí),我們得引入一個(gè) t0 在外層作用域并且改變 callback 來測量和記錄時(shí)間。

對(duì)我來說理想的方式是能夠僅僅通過包裝一個(gè)異步函數(shù)就能夠?qū)λM(jìn)行計(jì)時(shí):

timeIt(calc)(arg, (err, res) => console.log(err || res))

timeIt 需要能夠很好地對(duì)每一個(gè)異步函數(shù)完成剖析和記錄執(zhí)行時(shí)間。

注意到 timeIt(calc) 有與原始的 calc 函數(shù)同樣的函數(shù)簽名,即它們接受同樣的參數(shù)和返回同樣的值,它只是增加了一個(gè)特性到 cale 上(能夠被記錄時(shí)間的特性)。

calc 和 timeIt(calc) 在任意時(shí)刻可以相互替代。

timeIt 本身是一個(gè)高階函數(shù),因?yàn)樗邮芤粋€(gè)函數(shù)并返回一個(gè)函數(shù)。在我們的例子里,它接受 calc 異步函數(shù),并返回一個(gè)函數(shù)與 calc 有同樣的參數(shù)和返回值。

下面演示我們?nèi)绾螌?shí)現(xiàn) timeIt 函數(shù):

const timeIt = R.curry((report, f) => (...args) => {

 const t0 = Date.now()
 const nArgs = R.init(args)
 const callback = R.last(args)

 nArgs.push((...args) => {
 const t1 = Date.now()
 callback(...args)
 report(t1 - t0, ...args)
 })

 f(...nArgs)

})

const timeIt1 = timeIt(
 (t, err, res) => console.log(`Log: ${err || res} produced after: ${t}`)
)

const calc = (x, y, z, callback) =>
 setTimeout(() => callback(null, x * y / z), 1000)


calc(18, 7, 3, (err, res) => console.log(err || res))

timeIt1(calc)(18, 7, 3, (err, res) => console.log(err || res))

這個(gè) timeIt 實(shí)現(xiàn)接受兩個(gè)參數(shù):

      report: 一個(gè)函數(shù)用來生成剖析結(jié)果

      f: 我們想要做剖析的異步函數(shù)

timeIt1 是一個(gè)方便實(shí)用的功能函數(shù),它只是用 console.log 記錄時(shí)間測量結(jié)果。我們通過給更通用的 timeIt 函數(shù)傳入 report 參數(shù)來定義它。

我們實(shí)現(xiàn)了目標(biāo),現(xiàn)在我們可以僅僅將異步函數(shù)包裝在 timeIt1 中就可以對(duì)它計(jì)時(shí)了:

timeIt1(calc)(18, 7, 3, (err, res) => console.log(err || res))

通用的 timeIt 函數(shù)接收一個(gè) report 回調(diào)函數(shù)和一個(gè)異步函數(shù)并返回一個(gè)新的異步函數(shù),這個(gè)異步函數(shù)與原函數(shù)有同樣的參數(shù)和返回值。我們可以這么使用:

timeIt(
 (time, ...result) => // report callback: log the time
 , asyncFunc
)(
 parameters…, 
 (...result) => // result of the async function
)

現(xiàn)在讓我們深入 timeIt 的實(shí)現(xiàn)。我們可以簡單地生成一個(gè)通用函數(shù)類似 timeIt1,因?yàn)?timeIt 使用 R.curry 科里化了。

我不打算在這篇文章里討論科里化,但是下面這段代碼演示了科里化的主要用法:

const f = R.curry((x, y) => x + y)
f(1, 10) // == 11
f(1)(10) // == 11

const plus1 = f(1)
plus1(10) // == 11

另一方面,這種方式實(shí)現(xiàn)的 timeIt 有幾個(gè)問題:

(...args) => {
 const t1 = Date.now()
 callback(...args)
 report(t1 — t0, ...args)
}

這是一個(gè)匿名函數(shù)(又名 lambda,callback),它在原函數(shù)異步執(zhí)行之后被調(diào)用。主要的問題是這個(gè)函數(shù)沒有處理異常的機(jī)制。如果 callback 拋出異常,report 就永遠(yuǎn)不會(huì)被調(diào)用。

我們可以添加一個(gè) try / catch 到這個(gè) lambda 函數(shù)里,然而問題的根源是 callback report 是兩個(gè) void 函數(shù),它們沒有關(guān)聯(lián)在一起。timeIt 包含兩個(gè)延續(xù)(continuations)(report callback)。如果我們只是在 console 下記錄執(zhí)行時(shí)間或者如果我們確定不論 report 還是 callback 都不會(huì)拋出異常,那么一切正常。但是如果我們想要根據(jù)剖析結(jié)果來執(zhí)行一些行為(所謂的自動(dòng)擴(kuò)容)那么我們需要強(qiáng)化和厘清我們的程序中的延續(xù)序列。

好了,以上這篇文章的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)和工作有所幫助,如果有疑問可以留言交流。

相關(guān)文章

  • firefox瀏覽器不支持innerText的解決方法

    firefox瀏覽器不支持innerText的解決方法

    在測試時(shí)發(fā)現(xiàn)firefox不支持innerText,該怎么辦呢?其實(shí)很簡單,本文為大家提供了一個(gè)解決方法,感興趣的朋友可以參考下,希望對(duì)大家有所幫助
    2013-08-08
  • requestAnimationFrame用法優(yōu)化源碼解析

    requestAnimationFrame用法優(yōu)化源碼解析

    這篇文章主要介紹了requestAnimationFrame用法優(yōu)化源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • JavaScript基礎(chǔ)入門之錯(cuò)誤捕獲機(jī)制

    JavaScript基礎(chǔ)入門之錯(cuò)誤捕獲機(jī)制

    初級(jí)開發(fā)人員往往很少使用js的拋出和捕獲異常,但拋出和捕獲異常往往是非常必要的,這篇文章主要給大家介紹了關(guān)于JavaScript基礎(chǔ)入門之錯(cuò)誤捕獲機(jī)制的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • JS設(shè)計(jì)模式之狀態(tài)模式概念與用法分析

    JS設(shè)計(jì)模式之狀態(tài)模式概念與用法分析

    這篇文章主要介紹了JS設(shè)計(jì)模式之狀態(tài)模式概念與用法,簡單講述了狀態(tài)模式的概念、功能、應(yīng)用場景并結(jié)合javascript實(shí)例形式分析了狀態(tài)模式的簡單定義及使用方法,需要的朋友可以參考下
    2018-02-02
  • JavaScript從數(shù)組中刪除特定數(shù)據(jù)的方法總結(jié)

    JavaScript從數(shù)組中刪除特定數(shù)據(jù)的方法總結(jié)

    js數(shù)組是js部分非常重要的知識(shí),有時(shí)我們有這么個(gè)需求js數(shù)組刪除指定元素,下面這篇文章主要給大家介紹了關(guān)于JavaScript從數(shù)組中刪除特定數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下
    2022-08-08
  • 微信小程序HTTP接口請(qǐng)求封裝代碼實(shí)例

    微信小程序HTTP接口請(qǐng)求封裝代碼實(shí)例

    這篇文章主要介紹了微信小程序HTTP接口請(qǐng)求封裝代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • 淺析創(chuàng)建javascript對(duì)象的方法

    淺析創(chuàng)建javascript對(duì)象的方法

    下面小編就為大家?guī)硪黄獪\析創(chuàng)建javascript對(duì)象的方法。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-05-05
  • JS+HTML5 canvas繪制驗(yàn)證碼示例

    JS+HTML5 canvas繪制驗(yàn)證碼示例

    這篇文章主要介紹了JS+HTML5 canvas繪制驗(yàn)證碼,結(jié)合實(shí)例形式分析了HTML5 canvas圖形繪制相關(guān)操作技巧,需要的朋友可以參考下
    2018-12-12
  • JS getAttribute和setAttribute(取得和設(shè)置屬性)的使用介紹

    JS getAttribute和setAttribute(取得和設(shè)置屬性)的使用介紹

    本篇文章是對(duì)JS中的getAttribute和setAttribute(取得和設(shè)置屬性)的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以參考下
    2013-07-07
  • 微信小程序自定義計(jì)時(shí)器功能

    微信小程序自定義計(jì)時(shí)器功能

    這篇文章主要為大家詳細(xì)介紹了微信小程序自定義計(jì)時(shí)器功能,設(shè)置一個(gè)時(shí)間,可以開始倒計(jì)時(shí)、暫停,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-09-09

最新評(píng)論

临汾市| 沁水县| 凉城县| 光泽县| 成安县| 阿拉善右旗| 巴林左旗| 马山县| 视频| 皮山县| 聂荣县| 南投县| 营山县| 沂源县| 固镇县| 丹阳市| 崇明县| 布尔津县| 闵行区| 龙陵县| 读书| 石河子市| 蒲城县| 合江县| 滨海县| 广丰县| 玉山县| 余姚市| 平湖市| 渑池县| 东明县| 左贡县| 台前县| 盖州市| 吉木乃县| 梨树县| 丘北县| 惠安县| 手机| 邹平县| 曲周县|