Promise--異步的解決方案

Promise 對象是 JavaScript 的異步操作解決方案,為異步操作提供統(tǒng)一接口,使得異步操作具備同步操作的接口。Promise 可以讓異步操作寫起來,就像在寫同步操作的流程。

Promise是對象,也是一個(gè)構(gòu)造函數(shù)。

function f1(resolve, reject) {
  // 異步代碼...
}

var p1 = new Promise(f1);

Promise的設(shè)計(jì)思想是,異步任務(wù)返回一個(gè)Promise實(shí)例,Promise實(shí)例有個(gè)then方法,用來指定下一步的回調(diào)函數(shù)。

Promise實(shí)例有三種狀態(tài),分別是:

異步操作未完成(pending)
異步操作成功(fulfilled)
異步操作失?。╮ejected)

fulfilled和rejected合在一起稱為resolved(已定型)
異步操作成功,Promise 實(shí)例傳回一個(gè)值(value),狀態(tài)變?yōu)閒ulfilled。
異步操作失敗,Promise 實(shí)例拋出一個(gè)錯(cuò)誤(error),狀態(tài)變?yōu)閞ejected。
var promise = new Promise(function (resolve, reject) {
  // ...

  if (/* 異步操作成功 */){
    resolve(value);
  } else { /* 異步操作失敗 */
    reject(new Error());
  }
});

  • resolve函數(shù)的作用是,將Promise實(shí)例的狀態(tài)從“未完成”變?yōu)椤俺晒Α保磸膒ending變?yōu)閒ulfilled),在異步操作成功時(shí)調(diào)用,并將異步操作的結(jié)果,作為參數(shù)傳遞出去。reject函數(shù)的作用是,將Promise實(shí)例的狀態(tài)從“未完成”變?yōu)椤笆 保磸膒ending變?yōu)閞ejected),在異步操作失敗時(shí)調(diào)用,并將異步操作報(bào)出的錯(cuò)誤,作為參數(shù)傳遞出去。

Promise.then()

Promise 實(shí)例的then方法,用來添加回調(diào)函數(shù)。

then方法可以接受兩個(gè)回調(diào)函數(shù),第一個(gè)是異步操作成功時(shí)(變?yōu)閒ulfilled狀態(tài))時(shí)的回調(diào)函數(shù),第二個(gè)是異步操作失?。ㄗ?yōu)閞ejected)時(shí)的回調(diào)函數(shù)(該參數(shù)可以省略)。一旦狀態(tài)改變,就調(diào)用相應(yīng)的回調(diào)函數(shù)。

var p1 = new Promise(function (resolve, reject) {
  resolve('成功');
});
p1.then(console.log, console.error);
// "成功"

var p2 = new Promise(function (resolve, reject) {
  reject(new Error('失敗'));
});
p2.then(console.log, console.error);
// Error: 失敗


上面代碼中,p1和p2都是Promise 實(shí)例,它們的then方法綁定兩個(gè)回調(diào)函數(shù):成功時(shí)的回調(diào)函數(shù)console.log,失敗時(shí)的回調(diào)函數(shù)console.error(可以省略)。p1的狀態(tài)變?yōu)槌晒?,p2的狀態(tài)變?yōu)槭?,對?yīng)的回調(diào)函數(shù)會(huì)收到異步操作傳回的值,然后在控制臺(tái)輸出。

分析以下promise不同寫法下的不同結(jié)果

f1().then(function () {
  return f2();
}).then(f3);   //f3回調(diào)函數(shù)的參數(shù),是f2函數(shù)的運(yùn)行結(jié)果。

f1().then(function () {
  f2();
  return;
}).then(f3);  //f3回調(diào)函數(shù)的參數(shù)是undefined。
f1().then(f2())
  .then(f3);  //f3回調(diào)函數(shù)的參數(shù),是f2函數(shù)返回的函數(shù)的運(yùn)行結(jié)果。

f1().then(f2)
  .then(f3);  //f2會(huì)接收到f1()返回的結(jié)果。

圖片加載

我們把圖片的加載寫成一個(gè)Promise對象:

var a = function () {
    return new Promise(function (resolve, reject){
      var image = new Image()
      image.onload = resolve
      image.onerror = reject
      image.src = path 
    })
}


?著作權(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)容

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