资讯专栏INFORMATION COLUMN

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

Jrain / 1131人阅读

摘要:现在我们要用的重点就是我们的,这是一个能让函数并行的,可以基于多个。非常有用啊先上一个错误的代码这时候我们得到的就是数字了,而不是一个数组,这就是神奇所在。

看过 (一)的同学一定觉得这个Promise很简单,好像没什么可以用的地方,但是事实上,它的用处非常大啊,尤其是在nodejs上,愈加重要,虽然已经有大量的库实现了对Promise的封装了,不过我还是更倾向用原生的node来实现对Promise的实现。
现在我们要用的重点就是我们的Promise.all,这是一个能让函数并行的promise,可以基于多个Promise。我们讲介绍下简单的应用和在复杂的环境下的一些使用方法.

两个demo函数
function demo1(){
    return Promise.resolve(1);
}
function demo2(){
    return Promise.resolve(2);
}
function demo3(){
    return Promise.all([demo1(),demo2()]);
}

demo3().then(result=>{
    console.log(result)
}).catch(err=>{
    console.log(err)
})

基于以上的代码,你将得到一个数组,获得[1,2],其原理很简单,就是让两个函数同时开始异步操作,就是并行拉,然后返回的数据存放在一个数组,并且是按顺序的!!!而且注意,在Promise.all中,如果其中一个操作获得了reject或是error,那么我们都将得到一个reject,并且,这两个操作的最终时长是取决于两者中最长的那个,直到两个都完成了才能返回结果。非常有用啊!!

先上一个错误的代码

function demo1(){
    return Promise.resolve(1);
}
function demo2(){
    return Promise.reject(2);
}
function demo3(){
    return Promise.all([demo1(),demo2()]);
}

demo3().then(result=>{
    console.log(result)
}).catch(err=>{
    console.log(err)
})


这时候我们得到的就是数字2了,而不是一个数组,这就是神奇所在。
再最后一个例子就是Promise.race 这个简单介绍以下就好了,因为这个不常用,想想也知道你说你要执行两个操作,只要完成其中一个就返回其中一个的结果,除非是赛跑,不然这个东西有什么意义,比较难想象有能运用的地方,我写了这么就的Promise就是没用遇到过了!下面是例子

function demo1(){
    return Promise.resolve(1);
}
function demo2(){
    return Promise.resolve(2);
}
function demo3(){
    return Promise.race([demo1(),demo2()]);
}

demo3().then(result=>{
    console.log(result)
}).catch(err=>{
    console.log(err)
})


我们得到的结果将会是1或2,跟前面的reject一样,如果其中之一来reject,或是异常,一定会被catch捕获!这是毋庸置疑的,但前提是在两个之一都没有完成的情况下才能被捕获,所以是十分困难的。

运用以上的所有内容就基本能解决我们在项目中的大部分问题了,但是偶尔我们会遇到比较难的问题,下面拿我使用mongodb时候遇到的问题来讲解。大家可以忽略这些细节,更关注用法!

问题1 是:我要同时查10笔操作,可是我们该如何操作

    
    
  
 //这是10笔要查的数据集合
    var array = [1,2,3,4,5,6,7,8,9,10];
    //这里大家使用自己的数据库进行案例
    var model = mongoose.model("demo");
    Promise.all([array.map(i=>{
        return new Promise((resolve,reject)=>{
            resolve(demo(i))
        })
    })]).then(result=>{
        //获得十笔查询后的记录
        console.log(result);
    })
    
    
    function demo(name){
        return model.find({name:name}).exec();
    }

问题2:我该如何使用混合同步并发执行先查询图片名字,然后记录下来并且删除这些图片

//模拟查询图片
function queryImgs(){
    return new Promise((resolve,reject)=>{
    //返回查询结果
        resolve(1);
    })
}
//模拟删除图片
function deleteImg(imgs){
    return new Promise((resolve,reject)=>{
            resolve(1);
        })
}
//模拟记录图片
function recordImg(imgs){
    return new Promise((resolve,reject)=>{
            resolve(1);
        })
}

function delAndRecord(imgs){
    return Promise.all([deleteImgs(imgs),recordImgs(imgs)]);
}

queryImgs().then(delAndRecord).then(result=>{
    console.log(result)
}).catch(err=>{
    console.log(err)
})

当然,我们这边的deleteImgs和recordImgs都会继续划分,因为我们这里是并发的删除,我们是用方法就是用问题一来解决这些所有的东西!

以上就是两章内容,过几天上第三章内容,基本上就解决所有可能遇到的问题了!以上这些方法足以解决上百同时的并发查询!我指单个请求中包含的!

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

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

相关文章

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

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

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

    摘要:我们先介绍一下中的的一些调用再结合的应用逐步深入。这就是一些简单的的调用看起来不多,但是靠这个真得解决了许多必须同步并行的环境本身是一个对象在开始支持。存在两个回调函数根据个人的需求进行处理。 什么是promise?为什么要在nodejs中使用promise?使用promise到底有什么好处呢?实在太多了,一一说来不如直接上实战。我们先介绍一下nodejs中的promise的一些调用....

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

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

    AbnerMing 评论0 收藏0
  • Nodejs模块加载与ES6模块加载实现

    摘要:以后需要引用模块的变量函数类就在这个模块对象的取出,即使再次进来模块也不会重新执行,只会从缓存获取。所以对相同模块的再次加载都是优先缓存方式,核心模块的缓存检查依然优先于文件模块。内建模块导出启动会生成全局变量,提供方法协助加载内建模块。 原始时代 作为一门语言的引入代码方式,相较于其他如PHP的include和require,Ruby的require,Python的import机制,...

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

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

    李世赞 评论0 收藏0

发表评论

0条评论

Jrain

|高级讲师

TA的文章

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