摘要:我們先介紹一下中的的一些調用再結合的應用逐步深入。這就是一些簡單的的調用看起來不多,但是靠這個真得解決了許多必須同步并行的環境本身是一個對象在開始支持。存在兩個回調函數根據個人的需求進行處理。
什么是promise?為什么要在nodejs中使用promise?使用promise到底有什么好處呢?實在太多了,一一說來不如直接上實戰。我們先介紹一下nodejs中的promise的一些調用.再結合promise的應用逐步深入。
Promise.then Promise.catch Promise.resolve Promise.reject Promise.all Promise.race
這就是一些簡單的Promise的調用看起來不多,但是靠這個真得解決了許多必須同步并行的環境.
demo1
Promise本身是一個對象在nodejs 4.x開始支持。創建一個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")) })
這就是一個非常基礎的東西,resolve意味著成功解決,而reject意味著拒絕。但是如何繼續進行以后的事情,對事情的結果如何處理呢?這就是涉及到了Promise.then 這個東西意味著然后。Promise.then(resolveHandler,rejectHandler)存在兩個回調函數根據個人的需求進行處理。
promise.then(res => { console.log(res) }, err => { console.error(err) })
這兩個的順序是固定的,即使你處理的東西不需要res,你也必須用這樣的形式來正確表達
promise.then(null, err => { console.error(err) })
來讓promise理解你不需要resolve的handler
大家可以根據代碼看看我們獲得的東西究竟是什么,理解下res,err到底是什么,再看看接下來的東西
其實res就是當Promise的狀態為resolve下所返回的數據,而err則是Promise的狀態為reject情況下所返回的異常。用官方來講的話就是promise.then(onFulfilled, onRejected)。但是說實話我們在用then的時候我們對于onRejected是非常少的,因為它存在一些問題,導致我們都是用Promise.catch()來捕獲在前階段中出現的異常的。
接下來就是Promise.catch()的一些簡單用法
Promise.catch(err)主要存在一個回調正如我們看到的它的函數體獲得了一個err參數,也可以向前面這么理解把就是Promise.catch(errorHandler)就是錯誤處理函數。以下是它的用法
promise.then(res => { console.log(res) }).catch(err => { console.log(err) })
那么我們到底的一個具體的過程究竟是什么樣子的呢?這時候我們用簡單的一張圖來表示我們對當前的函數處理的一個過程的描述
從順序上來說不難看出,我們的Promise.catch本身就在我們的Promise.then()之后,一般都是就算不是在這之后也是放在最后進行捕獲的,它不僅僅可以捕獲我們在resolveHandler中處理函數遇到的異常,同時還能處理我們在rejectHandler中遇到的異常,所以非常游泳,如何你不寫rejectHandler他一樣能直接捕獲我們前一步的異常,也就是直接從Promise對象中reject過來的過程,意味著它是直接捕獲異常的,在catch前面的所有異常都會被他捕獲,我們可以把他想象成一個很大的try catch 塊來對異常進行處理,所以和我們在rejectHandler中能處理能做的,我們的catch都更勝一籌!所以我們大致都是用catch來處理整個Promise中可能產生的異常。以下是catch的直接捕獲異常圖
然后是我們的Promise.resolve和Promise.reject調用的一些簡單例子啊
demo2
Promise.resolve("resolve").then(res=>{ console.log(res) }) Promise.reject("error").catch(err=>{ console.error(err) })
這邊的意思的話,大家可能不難看出我們的Promise.resolve和Promise.reject 類似一個Promise對象的工廠,可以主觀地生成一個已經resolve或是reject的Promise對象,從而我們可以在這個對象的基礎上進行操作。而且這是一個靜態的方法,可以隨時隨地幫助我們應用Promise,這兩個調用的方法挺簡單的。
接下來是我們的多重then,catch的使用,我們都知道我們在then和catch中對應的回調函數都是有對應的參數的,而在一個存在Promise的函數我們所能獲得的參數必然是這樣的通過resolve或是reject傳過來的,那么還有沒有不適用resolve或是reject就能獲得參數的方法?這是肯定有的!
我們在then(handler)中返回一個數值,請注意,這時候通過我們的then返回
Promise.resolve(1) .then(res=>{ return res+1 }) .then(res=>{ console.log(res) }) .catch(err=>{ console.error(err) }) 最后我們得到便是2,而且這個then可以非常的長,每當我們完成一個事件的時候,它會接著往下走,直到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) }) 結果還是2,為什么呢?因為只要你通過return返回一個值的話,你所獲得的,都是一個resovle的狀態的Promise,要解決這個問題,你就只能拋異常,讓catch來捕獲了 把errorhandler 的回調函數改成 throw new Error(err)那么打印出來的將會大有不同! 而且比較有趣的是我們的catch和then都是可以混搭的,以下情況也是能繼續跑的 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又能繼續進行 console.log(res) })
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/79309.html
摘要:現在我們要用的重點就是我們的,這是一個能讓函數并行的,可以基于多個。非常有用啊先上一個錯誤的代碼這時候我們得到的就是數字了,而不是一個數組,這就是神奇所在。 看過 (一)的同學一定覺得這個Promise很簡單,好像沒什么可以用的地方,但是事實上,它的用處非常大啊,尤其是在nodejs上,愈加重要,雖然已經有大量的庫實現了對Promise的封裝了,不過我還是更傾向用原生的node來實現對...
摘要:現在我們要用的重點就是我們的,這是一個能讓函數并行的,可以基于多個。非常有用啊先上一個錯誤的代碼這時候我們得到的就是數字了,而不是一個數組,這就是神奇所在。 看過 (一)的同學一定覺得這個Promise很簡單,好像沒什么可以用的地方,但是事實上,它的用處非常大啊,尤其是在nodejs上,愈加重要,雖然已經有大量的庫實現了對Promise的封裝了,不過我還是更傾向用原生的node來實現對...
摘要:面對著線程相關的問題,出現了協程。協程的特點在于是一個線程執行,因此最大的優勢就是協程極高的執行效率。因為子程序切換不是線程切換,而是由程序自身控制,因此,沒有線程切換的開銷,和多線程比,線程數量越多,協程的性能優勢就越明顯。 Node的異步概念 理解異步非阻塞 提到Node,異步非阻塞會是第一個需要你理解的概念。很多人會把這實際上是兩個概念的詞混為一談,認為異步就是非阻塞的,而同步就...
摘要:強制類型轉換本章介紹了的數據類型之間的轉換即強制類型轉換包括顯式和隱式。強制類型轉換常常為人詬病但實際上很多時候它們是非常有用的。隱式強制類型轉換則沒有那么明顯是其他操作的副作用。在處理強制類型轉換的時候要十分小心尤其是隱式強制類型轉換。 前言 《你不知道的 javascript》是一個前端學習必讀的系列,讓不求甚解的JavaScript開發者迎難而上,深入語言內部,弄清楚JavaSc...
摘要:感謝大神的免費的計算機編程類中文書籍收錄并推薦地址,以后在倉庫里更新地址,聲音版全文狼叔如何正確的學習簡介現在,越來越多的科技公司和開發者開始使用開發各種應用。 說明 2017-12-14 我發了一篇文章《沒用過Node.js,就別瞎逼逼》是因為有人在知乎上黑Node.js。那篇文章的反響還是相當不錯的,甚至連著名的hax賀老都很認同,下班時讀那篇文章,竟然坐車的還坐過站了。大家可以很...
閱讀 3210·2021-11-24 09:39
閱讀 2939·2021-11-23 09:51
閱讀 898·2021-11-18 10:07
閱讀 3548·2021-10-11 10:57
閱讀 2749·2021-10-08 10:04
閱讀 3007·2021-09-26 10:11
閱讀 1052·2021-09-23 11:21
閱讀 2794·2019-08-29 17:28