成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

Jrain / 1165人閱讀

摘要:現(xiàn)在我們要用的重點(diǎn)就是我們的,這是一個(gè)能讓函數(shù)并行的,可以基于多個(gè)。非常有用啊先上一個(gè)錯(cuò)誤的代碼這時(shí)候我們得到的就是數(shù)字了,而不是一個(gè)數(shù)組,這就是神奇所在。

看過(guò) (一)的同學(xué)一定覺(jué)得這個(gè)Promise很簡(jiǎn)單,好像沒(méi)什么可以用的地方,但是事實(shí)上,它的用處非常大啊,尤其是在nodejs上,愈加重要,雖然已經(jīng)有大量的庫(kù)實(shí)現(xiàn)了對(duì)Promise的封裝了,不過(guò)我還是更傾向用原生的node來(lái)實(shí)現(xiàn)對(duì)Promise的實(shí)現(xiàn)。
現(xiàn)在我們要用的重點(diǎn)就是我們的Promise.all,這是一個(gè)能讓函數(shù)并行的promise,可以基于多個(gè)Promise。我們講介紹下簡(jiǎn)單的應(yīng)用和在復(fù)雜的環(huán)境下的一些使用方法.

兩個(gè)demo函數(shù)
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)
})

基于以上的代碼,你將得到一個(gè)數(shù)組,獲得[1,2],其原理很簡(jiǎn)單,就是讓兩個(gè)函數(shù)同時(shí)開(kāi)始異步操作,就是并行拉,然后返回的數(shù)據(jù)存放在一個(gè)數(shù)組,并且是按順序的?。?!而且注意,在Promise.all中,如果其中一個(gè)操作獲得了reject或是error,那么我們都將得到一個(gè)reject,并且,這兩個(gè)操作的最終時(shí)長(zhǎng)是取決于兩者中最長(zhǎng)的那個(gè),直到兩個(gè)都完成了才能返回結(jié)果。非常有用啊??!

先上一個(gè)錯(cuò)誤的代碼

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)
})


這時(shí)候我們得到的就是數(shù)字2了,而不是一個(gè)數(shù)組,這就是神奇所在。
再最后一個(gè)例子就是Promise.race 這個(gè)簡(jiǎn)單介紹以下就好了,因?yàn)檫@個(gè)不常用,想想也知道你說(shuō)你要執(zhí)行兩個(gè)操作,只要完成其中一個(gè)就返回其中一個(gè)的結(jié)果,除非是賽跑,不然這個(gè)東西有什么意義,比較難想象有能運(yùn)用的地方,我寫了這么就的Promise就是沒(méi)用遇到過(guò)了!下面是例子

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)
})


我們得到的結(jié)果將會(huì)是1或2,跟前面的reject一樣,如果其中之一來(lái)reject,或是異常,一定會(huì)被catch捕獲!這是毋庸置疑的,但前提是在兩個(gè)之一都沒(méi)有完成的情況下才能被捕獲,所以是十分困難的。

運(yùn)用以上的所有內(nèi)容就基本能解決我們?cè)陧?xiàng)目中的大部分問(wèn)題了,但是偶爾我們會(huì)遇到比較難的問(wèn)題,下面拿我使用mongodb時(shí)候遇到的問(wèn)題來(lái)講解。大家可以忽略這些細(xì)節(jié),更關(guān)注用法!

問(wèn)題1 是:我要同時(shí)查10筆操作,可是我們?cè)撊绾尾僮?/p>

    
    
  
 //這是10筆要查的數(shù)據(jù)集合
    var array = [1,2,3,4,5,6,7,8,9,10];
    //這里大家使用自己的數(shù)據(jù)庫(kù)進(jìn)行案例
    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();
    }

問(wèn)題2:我該如何使用混合同步并發(fā)執(zhí)行先查詢圖片名字,然后記錄下來(lái)并且刪除這些圖片

//模擬查詢圖片
function queryImgs(){
    return new Promise((resolve,reject)=>{
    //返回查詢結(jié)果
        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)
})

當(dāng)然,我們這邊的deleteImgs和recordImgs都會(huì)繼續(xù)劃分,因?yàn)槲覀冞@里是并發(fā)的刪除,我們是用方法就是用問(wèn)題一來(lái)解決這些所有的東西!

以上就是兩章內(nèi)容,過(guò)幾天上第三章內(nèi)容,基本上就解決所有可能遇到的問(wèn)題了!以上這些方法足以解決上百同時(shí)的并發(fā)查詢!我指單個(gè)請(qǐng)求中包含的!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/79458.html

相關(guān)文章

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

    摘要:現(xiàn)在我們要用的重點(diǎn)就是我們的,這是一個(gè)能讓函數(shù)并行的,可以基于多個(gè)。非常有用啊先上一個(gè)錯(cuò)誤的代碼這時(shí)候我們得到的就是數(shù)字了,而不是一個(gè)數(shù)組,這就是神奇所在。 看過(guò) (一)的同學(xué)一定覺(jué)得這個(gè)Promise很簡(jiǎn)單,好像沒(méi)什么可以用的地方,但是事實(shí)上,它的用處非常大啊,尤其是在nodejs上,愈加重要,雖然已經(jīng)有大量的庫(kù)實(shí)現(xiàn)了對(duì)Promise的封裝了,不過(guò)我還是更傾向用原生的node來(lái)實(shí)現(xiàn)對(duì)...

    verano 評(píng)論0 收藏0
  • 在非阻塞IOnodejs同步并行 ES6 promise 入門深入(一)

    摘要:我們先介紹一下中的的一些調(diào)用再結(jié)合的應(yīng)用逐步深入。這就是一些簡(jiǎn)單的的調(diào)用看起來(lái)不多,但是靠這個(gè)真得解決了許多必須同步并行的環(huán)境本身是一個(gè)對(duì)象在開(kāi)始支持。存在兩個(gè)回調(diào)函數(shù)根據(jù)個(gè)人的需求進(jìn)行處理。 什么是promise?為什么要在nodejs中使用promise?使用promise到底有什么好處呢?實(shí)在太多了,一一說(shuō)來(lái)不如直接上實(shí)戰(zhàn)。我們先介紹一下nodejs中的promise的一些調(diào)用....

    luffyZh 評(píng)論0 收藏0
  • “async”到async——Node異步流程控制總結(jié)

    摘要:面對(duì)著線程相關(guān)的問(wèn)題,出現(xiàn)了協(xié)程。協(xié)程的特點(diǎn)在于是一個(gè)線程執(zhí)行,因此最大的優(yōu)勢(shì)就是協(xié)程極高的執(zhí)行效率。因?yàn)樽映绦蚯袚Q不是線程切換,而是由程序自身控制,因此,沒(méi)有線程切換的開(kāi)銷,和多線程比,線程數(shù)量越多,協(xié)程的性能優(yōu)勢(shì)就越明顯。 Node的異步概念 理解異步非阻塞 提到Node,異步非阻塞會(huì)是第一個(gè)需要你理解的概念。很多人會(huì)把這實(shí)際上是兩個(gè)概念的詞混為一談,認(rèn)為異步就是非阻塞的,而同步就...

    AbnerMing 評(píng)論0 收藏0
  • Nodejs模塊加載與ES6模塊加載實(shí)現(xiàn)

    摘要:以后需要引用模塊的變量函數(shù)類就在這個(gè)模塊對(duì)象的取出,即使再次進(jìn)來(lái)模塊也不會(huì)重新執(zhí)行,只會(huì)從緩存獲取。所以對(duì)相同模塊的再次加載都是優(yōu)先緩存方式,核心模塊的緩存檢查依然優(yōu)先于文件模塊。內(nèi)建模塊導(dǎo)出啟動(dòng)會(huì)生成全局變量,提供方法協(xié)助加載內(nèi)建模塊。 原始時(shí)代 作為一門語(yǔ)言的引入代碼方式,相較于其他如PHP的include和require,Ruby的require,Python的import機(jī)制,...

    陳江龍 評(píng)論0 收藏0
  • 精讀《你不知道javascript(中卷)》

    摘要:強(qiáng)制類型轉(zhuǎn)換本章介紹了的數(shù)據(jù)類型之間的轉(zhuǎn)換即強(qiáng)制類型轉(zhuǎn)換包括顯式和隱式。強(qiáng)制類型轉(zhuǎn)換常常為人詬病但實(shí)際上很多時(shí)候它們是非常有用的。隱式強(qiáng)制類型轉(zhuǎn)換則沒(méi)有那么明顯是其他操作的副作用。在處理強(qiáng)制類型轉(zhuǎn)換的時(shí)候要十分小心尤其是隱式強(qiáng)制類型轉(zhuǎn)換。 前言 《你不知道的 javascript》是一個(gè)前端學(xué)習(xí)必讀的系列,讓不求甚解的JavaScript開(kāi)發(fā)者迎難而上,深入語(yǔ)言內(nèi)部,弄清楚JavaSc...

    李世贊 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<