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

資訊專欄INFORMATION COLUMN

翻譯連載 | 第 10 章:異步的函數(shù)式(上)-《JavaScript輕量級函數(shù)式編程》 |《你不知

Lucky_Boy / 1976人閱讀

摘要:這就是積極的函數(shù)式編程。上一章翻譯連載第章遞歸下輕量級函數(shù)式編程你不知道的姊妹篇原創(chuàng)新書移動前端高效開發(fā)實戰(zhàn)已在亞馬遜京東當(dāng)當(dāng)開售。

原文地址:Functional-Light-JS

原文作者:Kyle Simpson-《You-Dont-Know-JS》作者

關(guān)于譯者:這是一個流淌著滬江血液的純粹工程:認真,是 HTML 最堅實的梁柱;分享,是 CSS 里最閃耀的一瞥;總結(jié),是 JavaScript 中最嚴謹?shù)倪壿?。?jīng)過捶打磨練,成就了本書的中文版。本書包含了函數(shù)式編程之精髓,希望可以幫助大家在學(xué)習(xí)函數(shù)式編程的道路上走的更順暢。比心。

譯者團隊(排名不分先后):阿希、blueken、brucecham、cfanlife、dail、kyoko-df、l3ve、lilins、LittlePineapple、MatildaJin、冬青、pobusama、Cherry、蘿卜、vavd317、vivaxy、萌萌、zhouyao

第 10 章:異步的函數(shù)式(上)

閱讀到這里,你已經(jīng)學(xué)習(xí)了我所說的所有輕量級函數(shù)式編程的基礎(chǔ)概念,在本章節(jié)中,我們將把這些概念應(yīng)有到不同的情景當(dāng)中,但絕對不會有新的知識點。

到目前為止,我們所說的一切都是同步的,意味著我們調(diào)用函數(shù),傳入?yún)?shù)后馬上就會得到返回值。大部分的情況下是沒問題的,但這幾乎滿足不了現(xiàn)有的 JS 應(yīng)用。為了能在當(dāng)前的 JS 環(huán)境里使用上函數(shù)式編程,我們需要去了解異步的函數(shù)式編程。

本章的目的是拓展我們對用函數(shù)式編程管理數(shù)據(jù)的思維,以便之后我們在更多的業(yè)務(wù)上應(yīng)用。

時間狀態(tài)

在你所有的應(yīng)用里,最復(fù)雜的狀態(tài)就是時間。當(dāng)你操作的數(shù)據(jù)狀態(tài)改變過程比較直觀的時候,是很容易管理的。但是,如果狀態(tài)隨著時間因為響應(yīng)事件而隱晦的變化,管理這些狀態(tài)的難度將會成幾何級增長。

我們在本文中介紹的函數(shù)式編程可以讓代碼變得更可讀,從而增強了可靠性和可預(yù)見性。但是當(dāng)你添加異步操作到你的項目里的時候,這些優(yōu)勢將會大打折扣。

必須明確的一點是:并不是說一些操作不能用同步來完成,或者觸發(fā)異步行為很容易。協(xié)調(diào)那些可能會改變應(yīng)用程序的狀態(tài)的響應(yīng),這需要大量額外的工作。

所以,作為作者的你最好付出一些努力,或者只是留給閱讀你代碼的人一個難題,去弄清楚如果 A 在 B 之前完成,項目中狀態(tài)是什么,還有相反的情況是什么?這是一個浮夸的問題,但以我的觀點來看,這有一個確切的答案:如果可以把復(fù)雜的代碼變得更容易理解,作者就必須花費更多心思。

減少時間狀態(tài)

異步編程最為重要的一點是通過抽象時間來簡化狀態(tài)變化的管理。

為說明這一點,讓我們先來看下一種有競爭狀態(tài)(又稱,時間復(fù)雜度)的糟糕情況,且必須手動去管理里面的狀態(tài):

var customerId = 42;
var customer;

lookupCustomer( customerId, function onCustomer(customerRecord){
    var orders = customer ? customer.orders : null;
    customer = customerRecord;
    if (orders) {
        customer.orders = orders;
    }
} );

lookupOrders( customerId, function onOrders(customerOrders){
    if (!customer) {
        customer = {};
    }
    customer.orders = customerOrders;
} );

回調(diào)函數(shù) onCustomer(..)onOrders(..) 之間是互為競爭關(guān)系。假設(shè)他們都在運行,兩者都有可能先運行,那將無法預(yù)測到會發(fā)生什么。

如果我們可以把 lookupOrders(..) 寫到 onCustomer(..) 里面,那我們就可以確認 onOrders(..) 會在 onCustomer(..) 之后運行,但我們不能這么做,因為我們需要讓 2 個查詢同時執(zhí)行。

所以,為了讓這個基于時間的復(fù)雜狀態(tài)正?;?,我們用相應(yīng)的 if-聲明在各自的回調(diào)函數(shù)里來檢查外部作用域的變量 customer。當(dāng)各自的回調(diào)函數(shù)被執(zhí)行,將會去檢測 customer 的狀態(tài),從而確定各自的執(zhí)行順序,如果 customer 在回調(diào)函數(shù)里還沒被定義,那他就是先運行的,否則則是第二個運行的。

這些代碼可以運行,但是他違背了可讀性的原則。時間復(fù)雜度讓這個代碼變得難以閱讀。

讓我們改用 JS promise 來把時間因素抽離出來:

var customerId = 42;

var customerPromise = lookupCustomer( customerId );
var ordersPromise = lookupOrders( customerId );

customerPromise.then( function onCustomer(customer){
    ordersPromise.then( function onOrders(orders){
        customer.orders = orders;
    } );
} );

現(xiàn)在 onOrders(..) 回調(diào)函數(shù)存在 onCustomer(..) 回調(diào)函數(shù)里,所以他們各自的執(zhí)行順序是可以保證的。在各自的 then(..) 運行之前 lookupCustomer(..)lookupOrders(..) 被分別的調(diào)用,兩個查詢就已經(jīng)并行的執(zhí)行完了。

這可能不太明顯,但是這個代碼里還有其他內(nèi)在的競爭狀態(tài),那就是 promise 的定義沒有被體現(xiàn)出來。如果 orders 的查詢在把 onOrders(..) 回調(diào)函數(shù)被 ordersPromise.then(..) 調(diào)用前完成,那么就需要一些比較智能的 東西 來保存 orders 直到 onOrders(..) 能被調(diào)用。 同理,record (或者說customer)對象是否能在 onCustomer(..) 執(zhí)行時被接收到。

這里的 東西 和我們之前討論過的時間復(fù)雜度類似。但我們不必去擔(dān)心這些復(fù)雜性,無論是編碼或者是讀(更為重要)這些代碼的時候,因為對我們來說,promise 所處理的就是時間復(fù)雜度上的問題。

promise 以時間無關(guān)的方式來作為一個單一的值。此外,獲取 promise 的返回值是異步的,但卻是通過同步的方法來賦值?;蛘哒f, promise 給 = 操作符擴展隨時間動態(tài)賦值的功能,通過可靠的(時間無關(guān))方式。

接下來我們將探索如何以相同的方式,在時間上異步地拓展本書之前同步的函數(shù)式編程操作。

積極的 vs 惰性的

積極的和惰性的在計算機科學(xué)的領(lǐng)域并不是表揚或者批評的意思,而是描述一個操作是否立即執(zhí)行或者是延時執(zhí)行。

我們在本例子中看到的函數(shù)式編程操作可以被稱為積極的,因為它們同步(即時)地操作著離散的即時值或值的列表/結(jié)構(gòu)上的值。

回憶下:

var a = [1,2,3]

var b = a.map( v => v * 2 );

b;            // [2,4,6]

這里 ab 的映射就是積極的,因為它在執(zhí)行的那一刻映射了數(shù)組 a 里的所有的值,然后生成了一個新的數(shù)組 b 。即使之后你去修改 a ,比如說添加一個新的值到數(shù)組的最后一位,也不會影響到 b 的內(nèi)容。這就是積極的函數(shù)式編程。

但是如果是一個惰性的函數(shù)式編程操作呢?思考如下情況:

var a = [];

var b = mapLazy( a, v => v * 2 );

a.push( 1 );

a[0];        // 1
b[0];        // 2

a.push( 2 );

a[1];        // 2
b[1];        // 4

我們可以想象下 mapLazy(..) 本質(zhì)上 “監(jiān)聽” 了數(shù)組 a,只要一個新的值添加到數(shù)組的末端(使用 push(..)),它都會運行映射函數(shù) v => v * 2 并把改變后的值添加到數(shù)組 b 里。

注意: mapLazy(..) 的實現(xiàn)沒有被寫出來,是因為它是虛構(gòu)的方法,是不存在的。如果要實現(xiàn) ab 之間的惰性的操作,那么簡單的數(shù)組就需要變得更加聰明。

考慮下把 ab 關(guān)聯(lián)到一起的好處,無論何時何地,你添加一個值進 a 里,它都將改變且映射到 b 里。它比同為聲明式函數(shù)式編程的 map(..) 更強大,但現(xiàn)在它可以隨時地變化,進行映射時你不用知道 a 里面所有的值。

【上一章】翻譯連載 | 第 9 章:遞歸(下)-《JavaScript輕量級函數(shù)式編程》 |《你不知道的JS》姊妹篇

iKcamp原創(chuàng)新書《移動Web前端高效開發(fā)實戰(zhàn)》已在亞馬遜、京東、當(dāng)當(dāng)開售。

iKcamp官網(wǎng):http://www.ikcamp.com

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

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

相關(guān)文章

  • 翻譯連載 | 10 異步函數(shù)(下)-《JavaScript量級函數(shù)編程》 |《不知

    摘要:而數(shù)組里則是為每一個值運行一次映射函數(shù),無論這個值何時加入,然后把它返回到里。上一章翻譯連載第章異步的函數(shù)式上輕量級函數(shù)式編程你不知道的姊妹篇原創(chuàng)新書移動前端高效開發(fā)實戰(zhàn)已在亞馬遜京東當(dāng)當(dāng)開售。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 關(guān)于譯者:這是一個流淌著滬江血液的純粹工程:認真,是 ...

    魏明 評論0 收藏0
  • 翻譯連載 |《不知JS》姊妹篇 |《JavaScript 量級函數(shù)編程》- 引言&前言

    摘要:我稱之為輕量級函數(shù)式編程。序眾所周知,我是一個函數(shù)式編程迷。函數(shù)式編程有很多種定義。本書是你開啟函數(shù)式編程旅途的絕佳起點。事實上,已經(jīng)有很多從頭到尾正確的方式介紹函數(shù)式編程的書了。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson?。 禮ou-Dont-Know-JS》作者 譯者團隊(排名不分先后):阿希、blueken、brucecham、...

    2bdenny 評論0 收藏0
  • 前端_JavaScript

    摘要:為此決定自研一個富文本編輯器。例如當(dāng)要轉(zhuǎn)化的對象有環(huán)存在時子節(jié)點屬性賦值了父節(jié)點的引用,為了關(guān)于函數(shù)式編程的思考作者李英杰,美團金融前端團隊成員。只有正確使用作用域,才能使用優(yōu)秀的設(shè)計模式,幫助你規(guī)避副作用。 JavaScript 專題之惰性函數(shù) JavaScript 專題系列第十五篇,講解惰性函數(shù) 需求 我們現(xiàn)在需要寫一個 foo 函數(shù),這個函數(shù)返回首次調(diào)用時的 Date 對象,注意...

    Benedict Evans 評論0 收藏0
  • 翻譯連載 |《不知JS》姊妹篇 |《JavaScript 量級函數(shù)編程》- 1

    摘要:所以我覺得函數(shù)式編程領(lǐng)域更像學(xué)者的領(lǐng)域。函數(shù)式編程的原則是完善的,經(jīng)過了深入的研究和審查,并且可以被驗證。函數(shù)式編程是編寫可讀代碼的最有效工具之一可能還有其他。我知道很多函數(shù)式編程編程者會認為形式主義本身有助于學(xué)習(xí)。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson - 《You-Dont-Know-JS》作者 關(guān)于譯者:這是一個流淌著滬江血液...

    omgdog 評論0 收藏0
  • 翻譯連載 | 11 :融會貫通 -《JavaScript量級函數(shù)編程》 |《不知JS

    摘要:譯者團隊排名不分先后阿希冬青蘿卜萌萌輕量級函數(shù)式編程第章融會貫通現(xiàn)在你已經(jīng)掌握了所有需要掌握的關(guān)于輕量級函數(shù)式編程的內(nèi)容?;仡^想想我們用到的函數(shù)式編程原則。這兩個函數(shù)組合成一個映射函數(shù)通過,這就是融合見第章。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 關(guān)于譯者:這是一個流淌著滬江血液的純粹工程:...

    codeKK 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<