在非阻塞IO下的nodejs下的同步并行 ES6的 promise 从入门深刻(一)

什么是promise?为何要在nodejs中使用promise?使用promise到底有什么好处呢?实在太多了,一一说来不如直接上实战。咱们先介绍一下nodejs中的promise的一些调用.再结合promise的应用逐步深刻。node

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

这就是一些简单的Promise的调用看起来很少,可是靠这个真得解决了许多必须同步并行的环境.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)存在两个回调函数根据我的的需求进行处理。spa

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

这两个的顺序是固定的,即便你处理的东西不须要res,你也必须用这样的形式来正确表达code

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()来捕获在前阶段中出现的异常的。blog


接下来就是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)
     })
相关文章
相关标签/搜索