Promise

Promise 是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調(diào)函數(shù)和事件——更合理和更強(qiáng)大。它由社區(qū)最早提出和實(shí)現(xiàn),ES6 將其寫進(jìn)了語言標(biāo)準(zhǔn),統(tǒng)一了用法,原生提供了Promise對象。

基本用法

ES6 規(guī)定,Promise對象是一個(gè)構(gòu)造函數(shù),用來生成Promise實(shí)例。下面代碼創(chuàng)造了一個(gè)Promise實(shí)例。

new Promise(function(resolve,reject){
       console.log('Promise');
       resolve();
}).then(function(){
        console.log('resolved.');
})
console.log('Hi!');

// Promise
// Hi!
// resolved

錯(cuò)誤捕獲

promise.then(function(data) {
          // 成功時(shí)執(zhí)行的代碼塊
  }, function(err) {
         // 失敗時(shí)執(zhí)行的代碼塊
  });
// 等同于
promise.then(function(data) { //cb
          // 成功時(shí)執(zhí)行的代碼塊
  }).catch(function(err) {
         // 失敗時(shí)執(zhí)行的代碼塊
  });

其他promise方法

promise.all()【返回一個(gè) Promise實(shí)例,此實(shí)例在 iterable 參數(shù)內(nèi)所有的 promise 都“完成(resolved)”或參數(shù)中不包含 promise 時(shí)回調(diào)完成(resolve);如果參數(shù)中 promise 有一個(gè)失敗(rejected),此實(shí)例回調(diào)失敗(reject),失敗原因的是第一個(gè)失敗 promise 的結(jié)果

Promise.all([p1,p2,p3]).then(res=>{
            console.log(res)
     })

promise.race()【返回一個(gè) promise,一旦迭代器中的某個(gè)promise解決或拒絕,返回的 promise就會(huì)解決或拒絕?!?/p>

var promise1 = new Promise(function(resolve, reject) {
         setTimeout(resolve, 500, 'one');
});

var promise2 = new Promise(function(resolve, reject) {
        setTimeout(resolve, 100, 'two');
});

Promise.race([promise1, promise2]).then(function(value) {
        console.log(value);
});

// two

async/awite

ES2017 (ES7)標(biāo)準(zhǔn)引入了 async 函數(shù),使得異步操作變得更加方便。async 函數(shù)是什么?一句話,它就是 Generator 函數(shù)的語法糖。使異步代碼變成同步執(zhí)行。

基本用法

async函數(shù)返回一個(gè) Promise 對象,可以使用then方法添加回調(diào)函數(shù)。當(dāng)函數(shù)執(zhí)行的時(shí)候,一旦遇到await就會(huì)先返回,等到異步操作完成,再接著執(zhí)行函數(shù)體內(nèi)后面的語句。

function timeout(ms) {
  return new Promise((resolve) => {
    setTimeout(resolve, ms);
  });
}

async function asyncPrint(value, ms) {
  await timeout(ms);
  console.log(value);
}

asyncPrint('hello world', 50);
上面代碼指定 50 毫秒以后,輸出hello world。

返回Promise對象

async function f() {
  return 'hello world';
}

f().then(v => console.log(v))
// "hello world"

注意點(diǎn):

  1. async函數(shù)和普通函數(shù)一樣按順序執(zhí)行,同時(shí),在執(zhí)行到await語句時(shí),返回一個(gè)Promise對象

  2. await可以理解為將async函數(shù)掛起,直到等待的Promise被fulfill或者reject,再繼續(xù)執(zhí)行之后的代碼

  3. async函數(shù)的返回值和普通Promise沒有區(qū)別

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Promise 對象 Promise 的含義 Promise 是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調(diào)函...
    neromous閱讀 8,833評論 1 56
  • 一. Callback (回調(diào)函數(shù)) 1.定義:把函數(shù)當(dāng)作變量傳到另一個(gè)函數(shù)里,傳進(jìn)去之后執(zhí)行甚至返回等待之后的...
    hutn閱讀 1,617評論 0 2
  • 目錄:Promise 的含義基本用法Promise.prototype.then()Promise.prototy...
    BluesCurry閱讀 1,563評論 0 8
  • 單線程 JavaScript是一門單線程的語言,被廣泛應(yīng)用于瀏覽器和頁面DOM元素交互,自從Node.js出現(xiàn)后,...
    JunChow520閱讀 862評論 0 3
  • 一、Promise的含義 Promise在JavaScript語言中早有實(shí)現(xiàn),ES6將其寫進(jìn)了語言標(biāo)準(zhǔn),統(tǒng)一了用法...
    Alex灌湯貓閱讀 887評論 0 2

友情鏈接更多精彩內(nèi)容