看过 (一)的同窗必定以为这个Promise很简单,好像没什么能够用的地方,可是事实上,它的用处很是大啊,尤为是在nodejs上,越发重要,虽然已经有大量的库实现了对Promise的封装了,不过我仍是更倾向用原生的node来实现对Promise的实现。
如今咱们要用的重点就是咱们的Promise.all,这是一个能让函数并行的promise,能够基于多个Promise。咱们讲介绍下简单的应用和在复杂的环境下的一些使用方法.node
两个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,而且,这两个操做的最终时长是取决于二者中最长的那个,直到两个都完成了才能返回结果。很是有用啊!!mongodb
先上一个错误的代码 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笔操做,但是咱们该如何操做promise
//这是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都会继续划分,由于咱们这里是并发的删除,咱们是用方法就是用问题一来解决这些全部的东西!异步
以上就是两章内容,过几天上第三章内容,基本上就解决全部可能遇到的问题了!以上这些方法足以解决上百同时的并发查询!我指单个请求中包含的!mongoose