成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

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

luffyZh / 3056人閱讀

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

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

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

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

demo1
Promise本身是一個對象在nodejs 4.x開始支持。創(chuàng)建一個Promise對象很簡單,主要是分兩步

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

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

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

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

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

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

其實res就是當(dāng)Promise的狀態(tài)為resolve下所返回的數(shù)據(jù),而err則是Promise的狀態(tài)為reject情況下所返回的異常。用官方來講的話就是promise.then(onFulfilled, onRejected)。但是說實話我們在用then的時候我們對于onRejected是非常少的,因為它存在一些問題,導(dǎo)致我們都是用Promise.catch()來捕獲在前階段中出現(xiàn)的異常的。

接下來就是Promise.catch()的一些簡單用法

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

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

那么我們到底的一個具體的過程究竟是什么樣子的呢?這時候我們用簡單的一張圖來表示我們對當(dāng)前的函數(shù)處理的一個過程的描述

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

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

demo2

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

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

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

我們在then(handler)中返回一個數(shù)值,請注意,這時候通過我們的then返回

Promise.resolve(1)
    .then(res=>{
        return res+1
     })
    .then(res=>{
        console.log(res)
     })
    .catch(err=>{
        console.error(err)
     })
最后我們得到便是2,而且這個then可以非常的長,每當(dāng)我們完成一個事件的時候,它會接著往下走,直到then的終點,或中間被catch了。同樣的,如果我們在errhandler中返回了值,那么你覺得會是怎么樣?
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,為什么呢?因為只要你通過return返回一個值的話,你所獲得的,都是一個resovle的狀態(tài)的Promise,要解決這個問題,你就只能拋異常,讓catch來捕獲了
 把errorhandler 的回調(diào)函數(shù)改成 throw new Error(err)那么打印出來的將會大有不同!
 而且比較有趣的是我們的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=>{
         //因為拿到一個返回值了,所以我們后面的then又能繼續(xù)進(jìn)行
         console.log(res)
     })

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

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

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

    Edison 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<