Promise的基本用法(二)

  1. 什么是異步?
簡單的說就是先干一件事乳附, 中間去干其他的事,最終在回來干這件事。
  • 每一個(gè)任務(wù)都有一個(gè)或者多個(gè)回調(diào)函數(shù)(callback)皮胡,前一個(gè)任務(wù)結(jié)束的時(shí)候,不是執(zhí)行下一個(gè)任務(wù)防嗡,而是執(zhí)行回調(diào)函數(shù)悼院,后一個(gè)任務(wù)則是不等前一個(gè)任務(wù)結(jié)束就執(zhí)行,所以程序的執(zhí)行順序與任務(wù)順序不一致的袱耽,異步的杀餐。
function read(content){
    setTimeout(function(){
        console.log(content)
    } ,1000)
}

function read1(content){
    setTimeout(function(){
        console.log(content)
    },500)
}

read('我是read');
read1('我是read1');
console.log('我先輸出') //第一個(gè)輸出的
read和read1執(zhí)行,read和read1的函數(shù)體中有setTimeout朱巨,它是異步的(異步不支持return)
  • 同步:就是一個(gè)任務(wù)完成之后史翘,后邊跟著一個(gè)任務(wù)接著執(zhí)行;程序的執(zhí)行順序和排列順序是一直的(會(huì)阻塞代碼運(yùn)行)
  1. 異步的發(fā)展流程
    1).callback:回調(diào)函數(shù)
let fs = require('fs');
fs.readFile('path', 'utf8', function (err, data) {
    if (err) {
        console.log(err)
    }
    if (data) {
        fs.readFile(data, 'utf8', function (err, data) {
            console.log(data);
        });
    }
})
會(huì)等第一個(gè)回調(diào)函數(shù)成功才會(huì)執(zhí)行第二個(gè)回調(diào)函數(shù)冀续。有多層嵌套的問題琼讽。代碼不好維護(hù)修改

2).promise: 解決了回調(diào)地獄的問題,不會(huì)導(dǎo)致難以維護(hù)

let fs = require('fs');
function read(path){
    return new Promise(function(resolve,reject){
        fs.readFile(path,'utf8',function(err,data){
            if(err){
                reject(err)
            }else{
                resolve(data)
            }
        })
    })
}

let p = read('需要讀的文件路徑');
p.then((data)=>{
    console.log(data);
})

3).Generator 函數(shù)

  • 函數(shù)要用* 來標(biāo)識
  • 返回結(jié)果是一個(gè)迭代器, 迭代器有一個(gè)next方法,調(diào)用next后都會(huì)返回一個(gè)done和一個(gè)叫value的屬性

原理:將一個(gè)函數(shù)劃分成若干個(gè)小函數(shù),沒次調(diào)用時(shí)移動(dòng)指針洪唐,內(nèi)部是一個(gè)條件判斷钻蹬,走對應(yīng)的邏輯

function read(arrs){
    let index = 0; //默認(rèn)先迭代第一項(xiàng)
    let len = arrs.length;
    return {
        next(){
            return {value:arrs[index],done:index++===len?true:false}
        }
    }
}

let it = read(['react','vue','angular']);
// it.next(); // {done:false,value:'react'}
// it.next(); // {done:false,value:'vue'}
// it.next(); // {done:false,value:'angular'}
// it.next(); // {done:true,value:undefined}
缺點(diǎn):要手動(dòng)next執(zhí)行,才會(huì)進(jìn)行下一次

解決方案:co庫凭需,可以自動(dòng)的將generator進(jìn)行迭代
let bluebird = require('bluebird');
let fs = require('fs');
let read = bluebird.promisify(fs.readFile); //promise實(shí)例化
function* r() {
    let content1 = yield read('./2.promise/1.txt', 'utf8');
    let content2 = yield read(content1, 'utf8');
    return content2;
}
co(r()).then(function (data) {
    console.log(data)
})

4)async-await函數(shù)

  • ES2017 標(biāo)準(zhǔn)引入了 async 函數(shù)问欠,使得異步操作變得更加方便肝匆。寫起來就就像同步函數(shù),而且有簡便的方式處理異步
  • async 函數(shù)它其實(shí)就是 Generator 函數(shù)的語法糖溅潜。
let bluebird = require('bluebird');
let fs = require('fs');
let read = bluebird.promisify(fs.readFile);

// 用async 來修飾函數(shù)术唬,aysnc需要配await,await只能是promise
// async和await(語法糖)  === co + generator
async function r(){
    try{
        let content1 = await read('./2.promise/100.txt','utf8');
        let content2 = await read(content1,'utf8');
        return content2;
    }catch(e){ // 如果出錯(cuò)會(huì)catch
        console.log('err',e)
    }
}
// async函數(shù)返回的是promise,
r().then(function(data){
    console.log(data);
},function(err){

})

async +await解決的問題:

  • 回調(diào)地獄
  • 并發(fā)執(zhí)行異步,在同一時(shí)刻同步返回結(jié)果 Promise.all
  • 解決了返回值的問題
  • 可以實(shí)現(xiàn)代碼的try/catch(同步才可以使用try/catch);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末滚澜,一起剝皮案震驚了整個(gè)濱河市粗仓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌设捐,老刑警劉巖借浊,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異萝招,居然都是意外死亡蚂斤,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門槐沼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來曙蒸,“玉大人,你說我怎么就攤上這事岗钩∨撸” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵兼吓,是天一觀的道長臂港。 經(jīng)常有香客問我,道長视搏,這世上最難降的妖魔是什么审孽? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮浑娜,結(jié)果婚禮上佑力,老公的妹妹穿的比我還像新娘。我一直安慰自己棚愤,他們只是感情好搓萧,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著宛畦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪揍移。 梳的紋絲不亂的頭發(fā)上次和,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機(jī)與錄音那伐,去河邊找鬼踏施。 笑死石蔗,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的畅形。 我是一名探鬼主播养距,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼日熬!你這毒婦竟也來了棍厌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤竖席,失蹤者是張志新(化名)和其女友劉穎耘纱,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體毕荐,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡束析,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了憎亚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片员寇。...
    茶點(diǎn)故事閱讀 38,566評論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖第美,靈堂內(nèi)的尸體忽然破棺而出蝶锋,到底是詐尸還是另有隱情,我是刑警寧澤斋日,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布牲览,位于F島的核電站,受9級特大地震影響恶守,放射性物質(zhì)發(fā)生泄漏第献。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一兔港、第九天 我趴在偏房一處隱蔽的房頂上張望庸毫。 院中可真熱鬧,春花似錦衫樊、人聲如沸飒赃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽载佳。三九已至,卻和暖如春臀栈,著一層夾襖步出監(jiān)牢的瞬間蔫慧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工权薯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留姑躲,地道東北人睡扬。 一個(gè)月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像黍析,于是被迫代替她去往敵國和親卖怜。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 弄懂js異步 講異步之前阐枣,我們必須掌握一個(gè)基礎(chǔ)知識-event-loop马靠。 我們知道JavaScript的一大特點(diǎn)...
    DCbryant閱讀 2,706評論 0 5
  • topics: 1.The Node.js philosophy 2.The reactor pattern 3....
    宮若石閱讀 1,061評論 0 1
  • 什么是同步異步 同步:當(dāng)我們發(fā)出了請求,并不會(huì)等待響應(yīng)結(jié)果侮繁,而是會(huì)繼續(xù)執(zhí)行后面的代碼虑粥,響應(yīng)結(jié)果的處理在之后的事件循...
    liwuwuzhi閱讀 431評論 1 1
  • 前言 很多朋友對異步編程都處于“聽說很強(qiáng)大”的認(rèn)知狀態(tài)。鮮有在生產(chǎn)項(xiàng)目中使用它宪哩。而使用它的同學(xué)娩贷,則大多數(shù)都停留在知...
    星星在線閱讀 2,854評論 2 39
  • 一個(gè)簡單的rpc demo 最近在網(wǎng)上看到阿里巴巴2015年的中間件性能挑戰(zhàn)賽的一個(gè)題目,實(shí)現(xiàn)一個(gè)簡單的RPC框架...
    topgunviper閱讀 1,046評論 1 10