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

看过 (一)的同砚肯定以为这个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都邑继承分别,由于我们这里是并发的删除,我们是用要领就是用题目一来处理这些一切的东西!

以上就是两章内容,过几天上第三章内容,基本上就处理一切能够碰到的题目了!以上这些要领足以处理上百同时的并发查询!我指单个要求中包括的!

    原文作者:williamstar
    原文地址: https://segmentfault.com/a/1190000005130328
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞