異步編程

  1. 兩個函數(shù)并行執(zhí)行最簡作法
const fun1 = () => {
  setTimeout(()=>{// 方便測函數(shù)的執(zhí)行順序
    console.log("fun1")
  }, 1000)
}

const fun2 = () => {
  setTimeout(()=>{
    console.log("fun2")
  }, 100)
}

setTimeout(fun1)
setTimeout(fun2)

依次打印 fun2 fun1
在函數(shù)內(nèi)部寫計時器是為了便于測函數(shù)的執(zhí)行順序
  1. 兩個函數(shù)并行執(zhí)行后再去執(zhí)行其他操作

Promise

const fun1 = new Promise((resolve, reject) => {
  setTimeout(() => {
    console.log('f1')
    resolve("1")
  }, 1000)
})

const fun2 = new Promise((resolve, reject) => {
  setTimeout(() => {
    console.log('f2')
    reject('2')
  }, 800)
})

Promise.all([fun1, fun2]).then(values => {
  console.log('resolve', values)
}, values=>{
 console.log('reject', values)
})

// 打印順序依次是f2, reject 2, f1
有一個函數(shù)返回了reject, 則 then 的第二個函數(shù)會被調(diào)用,
僅當(dāng)兩個函數(shù)都 resolve 時昏翰,then 的第一個函數(shù)會被調(diào)用,values代表狀態(tài)下的參數(shù)
var p = Promise.all([1,2,3]);
var p2 = Promise.all([1,2,3, Promise.resolve(444)]);
var p3 = Promise.all([1,2,3, Promise.reject(555)]);

setTimeout(function(){
    console.log(p);
    console.log(p2);
    console.log(p3);
});

// 結(jié)果
Promise { [ 1, 2, 3 ] }
Promise { [ 1, 2, 3, 444 ] }
Promise { <rejected> 555 }

// 若去掉setTimeout 
Promise { <pending> }
Promise { <pending> }
Promise { <pending> }

在setTimeout 內(nèi)部執(zhí)行的是異步代碼隶糕,可以等到函數(shù)準(zhǔn)備好后尚揣,再獲取執(zhí)行環(huán)境。

Generator

const fun1 = () => {
  console.log('fun1')
  return '1'
}

const fun2 = () => {
  console.log('fun2')
  return '2'
}

function* gen(fun1, fun2, fun3) {
  yield fun1()
  yield fun2()

  return 'done!'
}

const g = gen(fun1, fun2)
console.log(g.next()) // fun1 { value: '1', done: false }
接著再執(zhí)行
console.log(g.next()) // fun2 { value: '2', done: false }

若同時打印摆出,則f1, f2均異步朗徊,完成順序因函數(shù)本身而定

async

const fun1 = () => {
  console.log('fun1')
  return 1
}

const fun2 = () => {
  console.log('fun2')
  return 2
}

async function handle(fun1, fun2) {
  const a = await fun1()
  const b = await fun2()
  console.log(a + b)
  return a
}

handle(fun1, fun2).then(value => {
  console.log(value)
})
打印順序:fun1 fun2 3 1

捕獲錯誤

const fun1 = () => {
  return new Promise((resolve, reject)=>{
    reject("error")
  })
  // throw 'oh, no'
}

const fun2 = () => {
  console.log('fun2')
  return 2
}

async function handle(fun1, fun2) {
  const a = await fun1()
  .catch(err => {
    console.log("a",err)
  })
  const b = await fun2()
  console.log(a, b)
  return "done"
}

handle(fun1, fun2).then(
  value => {
    console.log('resolve', value)
  },
  value => {
    console.log('reject', value)
  }
)
// 打印順序:
a error
fun2
undefined 2
resolve done

若將a 對應(yīng)函數(shù)后的catch 去掉, 則打印
reject error
錯誤經(jīng)捕獲后,執(zhí)行 then 參數(shù)中第一個回調(diào)函數(shù)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末偎漫,一起剝皮案震驚了整個濱河市爷恳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌象踊,老刑警劉巖温亲,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件棚壁,死亡現(xiàn)場離奇詭異,居然都是意外死亡铸豁,警方通過查閱死者的電腦和手機(jī)灌曙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來节芥,“玉大人在刺,你說我怎么就攤上這事⊥纺鳎” “怎么了蚣驼?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長相艇。 經(jīng)常有香客問我颖杏,道長,這世上最難降的妖魔是什么坛芽? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任留储,我火速辦了婚禮,結(jié)果婚禮上咙轩,老公的妹妹穿的比我還像新娘获讳。我一直安慰自己,他們只是感情好活喊,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布丐膝。 她就那樣靜靜地躺著,像睡著了一般钾菊。 火紅的嫁衣襯著肌膚如雪帅矗。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天煞烫,我揣著相機(jī)與錄音浑此,去河邊找鬼。 笑死滞详,一個胖子當(dāng)著我的面吹牛尤勋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播茵宪,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼最冰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了稀火?” 一聲冷哼從身側(cè)響起暖哨,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后篇裁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體沛慢,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年达布,在試婚紗的時候發(fā)現(xiàn)自己被綠了团甲。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡黍聂,死狀恐怖躺苦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情产还,我是刑警寧澤匹厘,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站脐区,受9級特大地震影響愈诚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜牛隅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一炕柔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧媒佣,春花似錦匕累、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽授霸。三九已至巡验,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間碘耳,已是汗流浹背显设。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留辛辨,地道東北人捕捂。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像斗搞,于是被迫代替她去往敵國和親指攒。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評論 2 355

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

  • 一.非阻塞和異步 借用知乎用戶嚴(yán)肅的回答在此總結(jié)下僻焚,同步和異步是針對消息通信機(jī)制允悦,同步代表一個client發(fā)出一個...
    Daniel_adu閱讀 1,827評論 0 8
  • 一、 一道面試題 前段時間面試虑啤,考察比較多的是js異步編程方面的相關(guān)知識點(diǎn)隙弛,如今架馋,正好輪到自己分享技術(shù),所以想把j...
    eraser123閱讀 705評論 3 5
  • 原文:https://davidwalsh.name/async-generators 現(xiàn)在你已經(jīng)了解了 ES6 ...
    NARUTO_86閱讀 1,528評論 0 1
  • 回調(diào)函數(shù) 最原始的callback全闷,優(yōu)點(diǎn)是簡單叉寂、容易理解,當(dāng)然也有很嚴(yán)重的缺點(diǎn)是不利于代碼的閱讀和維護(hù)总珠,多了之后的...
    席小白閱讀 324評論 3 4
  • ES6提供了異步編程的幾個新特性:本篇主要參考阮一峰大神的ES6文章屏鳍。 Promise 1.基本用法: Promi...
    小前seant閱讀 412評論 0 0