在非阻塞IO下的nodejs下的同步並行 ES6的 promise 從入門深刻(二)

看過 (一)的同窗必定以爲這個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

相關文章
相關標籤/搜索