资讯专栏INFORMATION COLUMN

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

luffyZh / 2992人阅读

摘要:我们先介绍一下中的的一些调用再结合的应用逐步深入。这就是一些简单的的调用看起来不多,但是靠这个真得解决了许多必须同步并行的环境本身是一个对象在开始支持。存在两个回调函数根据个人的需求进行处理。

什么是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)
     })

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/79309.html

相关文章

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

    摘要:现在我们要用的重点就是我们的,这是一个能让函数并行的,可以基于多个。非常有用啊先上一个错误的代码这时候我们得到的就是数字了,而不是一个数组,这就是神奇所在。 看过 (一)的同学一定觉得这个Promise很简单,好像没什么可以用的地方,但是事实上,它的用处非常大啊,尤其是在nodejs上,愈加重要,虽然已经有大量的库实现了对Promise的封装了,不过我还是更倾向用原生的node来实现对...

    Jrain 评论0 收藏0
  • 在非阻塞IOnodejs同步并行 ES6 promise 入门深入(二)

    摘要:现在我们要用的重点就是我们的,这是一个能让函数并行的,可以基于多个。非常有用啊先上一个错误的代码这时候我们得到的就是数字了,而不是一个数组,这就是神奇所在。 看过 (一)的同学一定觉得这个Promise很简单,好像没什么可以用的地方,但是事实上,它的用处非常大啊,尤其是在nodejs上,愈加重要,虽然已经有大量的库实现了对Promise的封装了,不过我还是更倾向用原生的node来实现对...

    verano 评论0 收藏0
  • “async”到async——Node异步流程控制总结

    摘要:面对着线程相关的问题,出现了协程。协程的特点在于是一个线程执行,因此最大的优势就是协程极高的执行效率。因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。 Node的异步概念 理解异步非阻塞 提到Node,异步非阻塞会是第一个需要你理解的概念。很多人会把这实际上是两个概念的词混为一谈,认为异步就是非阻塞的,而同步就...

    AbnerMing 评论0 收藏0
  • 精读《你不知道javascript(中卷)》

    摘要:强制类型转换本章介绍了的数据类型之间的转换即强制类型转换包括显式和隐式。强制类型转换常常为人诟病但实际上很多时候它们是非常有用的。隐式强制类型转换则没有那么明显是其他操作的副作用。在处理强制类型转换的时候要十分小心尤其是隐式强制类型转换。 前言 《你不知道的 javascript》是一个前端学习必读的系列,让不求甚解的JavaScript开发者迎难而上,深入语言内部,弄清楚JavaSc...

    李世赞 评论0 收藏0
  • 【全文】狼叔:如何正确学习Node.js

    摘要:感谢大神的免费的计算机编程类中文书籍收录并推荐地址,以后在仓库里更新地址,声音版全文狼叔如何正确的学习简介现在,越来越多的科技公司和开发者开始使用开发各种应用。 说明 2017-12-14 我发了一篇文章《没用过Node.js,就别瞎逼逼》是因为有人在知乎上黑Node.js。那篇文章的反响还是相当不错的,甚至连著名的hax贺老都很认同,下班时读那篇文章,竟然坐车的还坐过站了。大家可以很...

    Edison 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<