用Promise構造函數來解決地獄回調問題

簡介

  1. Promise 是一個 構造函數,既然是構造函數, 那麼,咱們就能夠 new Promise() 獲得一個 Promise 的實例;
  2. 在 Promise 上,有兩個函數,分別叫作 resolve(成功以後的回調函數) 和 reject(失敗以後的回調函數)
  3. 在 Promise 構造函數的 Prototype 屬性上,有一個 .then() 方法,也就說,只要是 Promise 構造函數建立的實例,均可以訪問到 .then() 方法
  4. Promise 表示一個 異步操做;每當咱們 new 一個 Promise 的實例,這個實例,就表示一個具體的異步操做;
  5. 既然 Promise 建立的實例,是一個異步操做,那麼,這個 異步操做的結果,只能有兩種狀態:
  • 狀態1: 異步執行成功了,須要在內部調用 成功的回調函數 resolve 把結果返回給調用者;
  • 狀態2: 異步執行失敗了,須要在內部調用 失敗的回調函數 reject 把結果返回給調用者;
  • 因爲 Promise 的實例,是一個異步操做,因此,內部拿到 操做的結果後,沒法使用 return 把操做的結果返回給調用者; 這時候,只能使用回調函數的形式,來把 成功 或 失敗的結果,返回給調用者;
  1. 咱們能夠在 new 出來的 Promise 實例上,調用 .then() 方法,【預先】 爲 這個 Promise 異步操做,指定 成功(resolve) 和 失敗(reject) 回調函數;

舉個例子

const fs = require('fs')

function getFileByPaht(fpath) {
  var promise = new Promise(function (resolve, reject) {
    fs.readFile(fpath, 'utf-8', (err, dataStr) => {
      if (err) return reject(err);
      resolve(dataStr);
    });
  });
  return promise;
}

getFileByPaht('./files/3.txt')
.then(function (dataStr) {
  console.log(dataStr);
}, function (err) {
  console.log(err.message);
})

複製代碼

Promise的內部執行順序

avatar

用Promise的 .then() 方法解決地獄回調

注意: Promise的 reject 部分傳入的函數能夠爲空,便可不寫文件讀取失敗後的操做,promise

getFileByPath('./files/1222.txt')
  .then(function (data) {
    console.log(data);
    return getFileByPath('./files/2.txt');
  }, 
  .then(function (data) {
    console.log(data);
    return getFileByPath('./files/3.txt');
  })
  .then(function (data) {
    console.log(data);
  })
複製代碼

Promise中的異常處理

狀況一:在讀取文件出錯的部分報錯,但不影響後方代碼的執行異步

getFileByPath('./files/1222.txt')
  .then(function (data) {
    console.log(data);
    return getFileByPath('./files/2.txt');
  }, function (err) {
    console.log('讀取失敗:' + err.message);
    return getFileByPath('./files/2.txt');
  })
  .then(function (data) {
    console.log(data);
    return getFileByPath('./files/3.txt');
  })
  .then(function (data) {
    console.log(data);
  })
複製代碼

狀況二:若是前面任何的Promise執行失敗,就中止運行後面的方法(catch捕獲機制)函數

getFileByPath('./files/1222.txt')
  .then(function (data) {
    console.log(data);
    return getFileByPath('./files/2.txt');
  })
  .then(function (data) {
    console.log(data);
    return getFileByPath('./files/3.txt');
  })
  .then(function (data) {
    console.log(data);
  })
  .catch(function (err) {  
    console.log('異常捕獲: ' + err.message);
  })
複製代碼
相關文章
相關標籤/搜索