国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

在非阻塞IO下的nodejs下的同步并行 ES6的 promise 從入門深入(一)

luffyZh / 3001人閱讀

摘要:我們先介紹一下中的的一些調(diào)用再結(jié)合的應(yīng)用逐步深入。這就是一些簡(jiǎn)單的的調(diào)用看起來(lái)不多,但是靠這個(gè)真得解決了許多必須同步并行的環(huán)境本身是一個(gè)對(duì)象在開(kāi)始支持。存在兩個(gè)回調(diào)函數(shù)根據(jù)個(gè)人的需求進(jìn)行處理。

什么是promise?為什么要在nodejs中使用promise?使用promise到底有什么好處呢?實(shí)在太多了,一一說(shuō)來(lái)不如直接上實(shí)戰(zhàn)。我們先介紹一下nodejs中的promise的一些調(diào)用.再結(jié)合promise的應(yīng)用逐步深入。

Promise.then
Promise.catch
Promise.resolve
Promise.reject
Promise.all
Promise.race

這就是一些簡(jiǎn)單的Promise的調(diào)用看起來(lái)不多,但是靠這個(gè)真得解決了許多必須同步并行的環(huán)境.

demo1
Promise本身是一個(gè)對(duì)象在nodejs 4.x開(kāi)始支持。創(chuàng)建一個(gè)Promise對(duì)象很簡(jiǎn)單,主要是分兩步

var promise = new Promise((resolve,reject)=>{
    var data = [1,2,3]
    if(data.length > 3)
         resolve(data)
    else
        reject(new Error("array length invalid"))
})

這就是一個(gè)非常基礎(chǔ)的東西,resolve意味著成功解決,而reject意味著拒絕。但是如何繼續(xù)進(jìn)行以后的事情,對(duì)事情的結(jié)果如何處理呢?這就是涉及到了Promise.then 這個(gè)東西意味著然后。Promise.then(resolveHandler,rejectHandler)存在兩個(gè)回調(diào)函數(shù)根據(jù)個(gè)人的需求進(jìn)行處理。

  promise.then(res => {
    console.log(res)
}, err => {
    console.error(err)
})

這兩個(gè)的順序是固定的,即使你處理的東西不需要res,你也必須用這樣的形式來(lái)正確表達(dá)

promise.then(null, err => {
    console.error(err)
})

來(lái)讓promise理解你不需要resolve的handler
大家可以根據(jù)代碼看看我們獲得的東西究竟是什么,理解下res,err到底是什么,再看看接下來(lái)的東西

其實(shí)res就是當(dāng)Promise的狀態(tài)為resolve下所返回的數(shù)據(jù),而err則是Promise的狀態(tài)為reject情況下所返回的異常。用官方來(lái)講的話就是promise.then(onFulfilled, onRejected)。但是說(shuō)實(shí)話我們?cè)谟胻hen的時(shí)候我們對(duì)于onRejected是非常少的,因?yàn)樗嬖谝恍﹩?wèn)題,導(dǎo)致我們都是用Promise.catch()來(lái)捕獲在前階段中出現(xiàn)的異常的。

接下來(lái)就是Promise.catch()的一些簡(jiǎn)單用法

Promise.catch(err)主要存在一個(gè)回調(diào)正如我們看到的它的函數(shù)體獲得了一個(gè)err參數(shù),也可以向前面這么理解把就是Promise.catch(errorHandler)就是錯(cuò)誤處理函數(shù)。以下是它的用法

promise.then(res => {
    console.log(res)
}).catch(err => {
    console.log(err)
})

那么我們到底的一個(gè)具體的過(guò)程究竟是什么樣子的呢?這時(shí)候我們用簡(jiǎn)單的一張圖來(lái)表示我們對(duì)當(dāng)前的函數(shù)處理的一個(gè)過(guò)程的描述

從順序上來(lái)說(shuō)不難看出,我們的Promise.catch本身就在我們的Promise.then()之后,一般都是就算不是在這之后也是放在最后進(jìn)行捕獲的,它不僅僅可以捕獲我們?cè)趓esolveHandler中處理函數(shù)遇到的異常,同時(shí)還能處理我們?cè)趓ejectHandler中遇到的異常,所以非常游泳,如何你不寫rejectHandler他一樣能直接捕獲我們前一步的異常,也就是直接從Promise對(duì)象中reject過(guò)來(lái)的過(guò)程,意味著它是直接捕獲異常的,在catch前面的所有異常都會(huì)被他捕獲,我們可以把他想象成一個(gè)很大的try catch 塊來(lái)對(duì)異常進(jìn)行處理,所以和我們?cè)趓ejectHandler中能處理能做的,我們的catch都更勝一籌!所以我們大致都是用catch來(lái)處理整個(gè)Promise中可能產(chǎn)生的異常。以下是catch的直接捕獲異常圖

然后是我們的Promise.resolve和Promise.reject調(diào)用的一些簡(jiǎn)單例子啊

demo2

Promise.resolve("resolve").then(res=>{
    console.log(res)
})
Promise.reject("error").catch(err=>{
    console.error(err)
})

這邊的意思的話,大家可能不難看出我們的Promise.resolve和Promise.reject 類似一個(gè)Promise對(duì)象的工廠,可以主觀地生成一個(gè)已經(jīng)resolve或是reject的Promise對(duì)象,從而我們可以在這個(gè)對(duì)象的基礎(chǔ)上進(jìn)行操作。而且這是一個(gè)靜態(tài)的方法,可以隨時(shí)隨地幫助我們應(yīng)用Promise,這兩個(gè)調(diào)用的方法挺簡(jiǎn)單的。

接下來(lái)是我們的多重then,catch的使用,我們都知道我們?cè)趖hen和catch中對(duì)應(yīng)的回調(diào)函數(shù)都是有對(duì)應(yīng)的參數(shù)的,而在一個(gè)存在Promise的函數(shù)我們所能獲得的參數(shù)必然是這樣的通過(guò)resolve或是reject傳過(guò)來(lái)的,那么還有沒(méi)有不適用resolve或是reject就能獲得參數(shù)的方法?這是肯定有的!

我們?cè)趖hen(handler)中返回一個(gè)數(shù)值,請(qǐng)注意,這時(shí)候通過(guò)我們的then返回

Promise.resolve(1)
    .then(res=>{
        return res+1
     })
    .then(res=>{
        console.log(res)
     })
    .catch(err=>{
        console.error(err)
     })
最后我們得到便是2,而且這個(gè)then可以非常的長(zhǎng),每當(dāng)我們完成一個(gè)事件的時(shí)候,它會(huì)接著往下走,直到then的終點(diǎn),或中間被catch了。同樣的,如果我們?cè)趀rrhandler中返回了值,那么你覺(jué)得會(huì)是怎么樣?
Promise.reject(1)
    .then(res=>{
        return res+3
     },err=>{
         return err+1
     })
    .then(res=>{
        console.log(res)
     })
    .catch(err=>{
        console.error(err + 1)
     })
 結(jié)果還是2,為什么呢?因?yàn)橹灰阃ㄟ^(guò)return返回一個(gè)值的話,你所獲得的,都是一個(gè)resovle的狀態(tài)的Promise,要解決這個(gè)問(wèn)題,你就只能拋異常,讓catch來(lái)捕獲了
 把errorhandler 的回調(diào)函數(shù)改成 throw new Error(err)那么打印出來(lái)的將會(huì)大有不同!
 而且比較有趣的是我們的catch和then都是可以混搭的,以下情況也是能繼續(xù)跑的
 
Promise.resolve(1)
    .then(res=>{
        return res+1
     },err=>{
         return err+1
     })
    .then(res=>{
        console.log(res)
     })
    .catch(err=>{
         return  err+1
     }).then(res=>{
         //因?yàn)槟玫揭粋€(gè)返回值了,所以我們后面的then又能繼續(xù)進(jìn)行
         console.log(res)
     })

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/79309.html

相關(guān)文章

  • 在非阻塞IOnodejs同步并行 ES6 promise 入門深入(二)

    摘要:現(xiàn)在我們要用的重點(diǎn)就是我們的,這是一個(gè)能讓函數(shù)并行的,可以基于多個(gè)。非常有用啊先上一個(gè)錯(cuò)誤的代碼這時(shí)候我們得到的就是數(shù)字了,而不是一個(gè)數(shù)組,這就是神奇所在。 看過(guò) (一)的同學(xué)一定覺(jué)得這個(gè)Promise很簡(jiǎn)單,好像沒(méi)什么可以用的地方,但是事實(shí)上,它的用處非常大啊,尤其是在nodejs上,愈加重要,雖然已經(jīng)有大量的庫(kù)實(shí)現(xiàn)了對(duì)Promise的封裝了,不過(guò)我還是更傾向用原生的node來(lái)實(shí)現(xiàn)對(duì)...

    Jrain 評(píng)論0 收藏0
  • 在非阻塞IOnodejs同步并行 ES6 promise 入門深入(二)

    摘要:現(xiàn)在我們要用的重點(diǎn)就是我們的,這是一個(gè)能讓函數(shù)并行的,可以基于多個(gè)。非常有用啊先上一個(gè)錯(cuò)誤的代碼這時(shí)候我們得到的就是數(shù)字了,而不是一個(gè)數(shù)組,這就是神奇所在。 看過(guò) (一)的同學(xué)一定覺(jué)得這個(gè)Promise很簡(jiǎn)單,好像沒(méi)什么可以用的地方,但是事實(shí)上,它的用處非常大啊,尤其是在nodejs上,愈加重要,雖然已經(jīng)有大量的庫(kù)實(shí)現(xiàn)了對(duì)Promise的封裝了,不過(guò)我還是更傾向用原生的node來(lái)實(shí)現(xiàn)對(duì)...

    verano 評(píng)論0 收藏0
  • “async”到async——Node異步流程控制總結(jié)

    摘要:面對(duì)著線程相關(guān)的問(wèn)題,出現(xiàn)了協(xié)程。協(xié)程的特點(diǎn)在于是一個(gè)線程執(zhí)行,因此最大的優(yōu)勢(shì)就是協(xié)程極高的執(zhí)行效率。因?yàn)樽映绦蚯袚Q不是線程切換,而是由程序自身控制,因此,沒(méi)有線程切換的開(kāi)銷,和多線程比,線程數(shù)量越多,協(xié)程的性能優(yōu)勢(shì)就越明顯。 Node的異步概念 理解異步非阻塞 提到Node,異步非阻塞會(huì)是第一個(gè)需要你理解的概念。很多人會(huì)把這實(shí)際上是兩個(gè)概念的詞混為一談,認(rèn)為異步就是非阻塞的,而同步就...

    AbnerMing 評(píng)論0 收藏0
  • 精讀《你不知道javascript(中卷)》

    摘要:強(qiáng)制類型轉(zhuǎn)換本章介紹了的數(shù)據(jù)類型之間的轉(zhuǎn)換即強(qiáng)制類型轉(zhuǎn)換包括顯式和隱式。強(qiáng)制類型轉(zhuǎn)換常常為人詬病但實(shí)際上很多時(shí)候它們是非常有用的。隱式強(qiáng)制類型轉(zhuǎn)換則沒(méi)有那么明顯是其他操作的副作用。在處理強(qiáng)制類型轉(zhuǎn)換的時(shí)候要十分小心尤其是隱式強(qiáng)制類型轉(zhuǎn)換。 前言 《你不知道的 javascript》是一個(gè)前端學(xué)習(xí)必讀的系列,讓不求甚解的JavaScript開(kāi)發(fā)者迎難而上,深入語(yǔ)言內(nèi)部,弄清楚JavaSc...

    李世贊 評(píng)論0 收藏0
  • 【全文】狼叔:如何正確學(xué)習(xí)Node.js

    摘要:感謝大神的免費(fèi)的計(jì)算機(jī)編程類中文書籍收錄并推薦地址,以后在倉(cāng)庫(kù)里更新地址,聲音版全文狼叔如何正確的學(xué)習(xí)簡(jiǎn)介現(xiàn)在,越來(lái)越多的科技公司和開(kāi)發(fā)者開(kāi)始使用開(kāi)發(fā)各種應(yīng)用。 說(shuō)明 2017-12-14 我發(fā)了一篇文章《沒(méi)用過(guò)Node.js,就別瞎逼逼》是因?yàn)橛腥嗽谥跎虾贜ode.js。那篇文章的反響還是相當(dāng)不錯(cuò)的,甚至連著名的hax賀老都很認(rèn)同,下班時(shí)讀那篇文章,竟然坐車的還坐過(guò)站了。大家可以很...

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

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

0條評(píng)論

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