中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Promise對象怎么在Nodejs中使用

發布時間:2021-03-31 16:19:46 來源:億速云 閱讀:236 作者:Leah 欄目:web開發

這期內容當中小編將會給大家帶來有關Promise對象怎么在Nodejs中使用,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

Promise對象

1. promise用來做什么?

我們的需求是一次的去執行異步代碼

我們的做法是在異步請求成功后的回調函數里,執行下一個異步請求

但是這樣就出現了回調地獄(回調函數中嵌套了回調函數,代碼的閱讀性 低,維護不變,讓人看著害怕)

promise就是用來解決回調地獄的

回調地獄示例:

// 需求:一次的讀取a,b,c這三個文件
const fs = require("fs");

// 讀a文件
fs.readFile(`${__dirname}/etc/a.txt`, "utf-8", (err, data) => {
  if (err) {
    console.log(err);
  } else {
    console.log(data);
    // 讀b文件
    fs.readFile(`${__dirname}/etc/b.txt`, "utf-8", (err, data) => {
      if (err) {
        console.log(err);
      } else {
        console.log(data);
        // 讀c文件
        fs.readFile(`${__dirname}/etc/c.txt`, "utf-8", (err, data) => {
          if (err) {
            console.log(err);
          } else {
            console.log(data);
          }
        });
      }
    });
  }
});

2. promise工作流程

es6的語法,es6.ruanyifeng.com

Promise對象是一個構造函數 ,用來生成promise實例

Promise構造函數接受一個函數作為參數

這個作為參數的函數,又有兩個參數,這兩個參數分別是resolve和reject

這兩個參數它們也是函數,只不過這兩個函數由 javascript 引擎提供,不用自己部署

異步操作成功后調用resolve()方法,他內部調用了then()里面的第一個參數函數

異步操作成功后調用reject()方法,他內部調用了then()里面的第二個參數函數.

const fs = require("fs");
// 調用Promise構造函數,創建一個promise的實例
let p = new Promise((resolve, reject) => {
  // 寫異步操作(讀文件)
  fs.readFile(`${__dirname}/etc/a.txt`, "utf-8", (err, data) => {
    if (!err) {
      // 操作成功(讀文件成功)
      resolve(data); // 調用resolve方法
      // 調用then()里面的第一個參數函數
    } else {
      reject(err); // 調用reject方法
      // 調用then()里面的第二個參數函數
    }
  });
});

p.then(
  (data) => {
    console.log(data);
  },
  (err) => {
    console.log(err);
  }
);

3. promise原理

Promise對象代表一個異步操作.

有三種狀態: pending (進行中)、fulfilled (已成功)和rejected (已失敗)

Promise對象的狀態改變,只有兩種可能:從pending變 為fulfilled和從pending變為rejected。

只有異步操作的結果,可以決定當前是哪一種狀態,任何其他操作都無法改變這個狀態

如果異步操作成功了(讀文件成功了),從pending (進行中)變為 fulfilled (已成功) ;

如果異步操作失敗了(讀文件失敗了),從pending (進行中)變為 rejected (已失敗) ;

狀態如果已經確定了, 就不會再去改變這個狀態了

4. promise特點及其封裝

Promise新建后就會立即執行

所以不要在promise里面寫其他的代碼,只寫這個異步操作的代碼就可以了

const fs = require("fs");
function getPromise(filename) {
  // 調用Promise構造函數,創建一個promise的實例
  return new Promise((resolve, reject) => {
    // 寫異步操作(讀文件)
    fs.readFile(`${__dirname}/etc/${filename}.txt`, "utf-8", (err, data) => {
      if (!err) {
        // 操作成功(讀文件成功)
        resolve(data); // 調用resolve方法
        // 調用then()里面的第一個參數函數
      } else {
        reject(err); // 調用reject方法
        // 調用then()里面的第二個參數函數
      }
    });
  });
}

// console.log(getPromise("a"));
getPromise("a").then(
  (data) => {
    console.log(data);
  },
  (err) => {
    console.log(err);
  }
);

5. promise正確寫法

promise如何解決回調地獄

-》 鏈式編程解決

**我們用promise解決的問題:讓異步操作有順序,并且不能有回調地獄 **

讓異步操作有順序本質是:

異步操作實際上是沒有順序的

在異步操作成功后的回調函數里返回另外的promise,調用他的then方法

const fs = require("fs");
function getPromise(filename) {
  // 調用Promise構造函數,創建一個promise的實例
  return new Promise((resolve, reject) => {
    // 寫異步操作(讀文件)
    fs.readFile(`${__dirname}/etc/${filename}.txt`, "utf-8", (err, data) => {
      if (!err) {
        // 操作成功(讀文件成功)
        resolve(data); // 調用resolve方法
        // 調用then()里面的第一個參數函數
      } else {
        reject(err); // 調用reject方法
        // 調用then()里面的第二個參數函數
      }
    });
  });
}

// console.log(getPromise("a"));
getPromise("a")
  .then((data) => {
    console.log(data);
    //調用函數得到一個讀b文件的promise對象并返回
    return getPromise("b");
  })
  .then((data) => {
    console.log(data);
    //調用函數得到一個讀c文件的promise對象并返回
    return getPromise("c");
  })
  .then((data) => {
    console.log(data);
  });

6. promise的其他方法

  • catch()

    能夠抓取錯誤的

    const fs = require("fs");
    function getPromise(filename) {
      // 調用Promise構造函數,創建一個promise的實例
      return new Promise((resolve, reject) => {
        // 寫異步操作(讀文件)
        fs.readFile(`${__dirname}/etc/${filename}.txt`, "utf-8", (err, data) => {
          if (!err) {
            // 操作成功(讀文件成功)
            resolve(data); // 調用resolve方法
            // 調用then()里面的第一個參數函數
          } else {
            reject(err); // 調用reject方法
            // 調用then()里面的第二個參數函數
          }
        });
      });
    }
    
    // console.log(getPromise("a"));
    getPromise("a")
      .then((data) => {
        console.log(data);
        //調用函數得到一個讀b文件的promise對象并返回
        return getPromise("b");
      })
      .then((data) => {
        console.log(data);
        //調用函數得到一個讀c文件的promise對象并返回
        return getPromise("c");
      })
      .then((data) => {
        console.log(data);
      })
      .catch((err) => {
        console.log(err);
      });
  • all()

    const fs = require("fs");
    function getPromise(filename) {
      // 調用Promise構造函數,創建一個promise的實例
      return new Promise((resolve, reject) => {
        // 寫異步操作(讀文件)
        fs.readFile(`${__dirname}/etc/${filename}.txt`, "utf-8", (err, data) => {
          if (!err) {
            // 操作成功(讀文件成功)
            resolve(data); // 調用resolve方法
            // 調用then()里面的第一個參數函數
          } else {
            reject(err); // 調用reject方法
            // 調用then()里面的第二個參數函數
          }
        });
      });
    }
    
    let p1 = getPromise("a");
    let p2 = getPromise("b");
    let p3 = getPromise("c");
    
    // Promise.all()方法用于將多個 Promise 實例,包裝成一個新的 Promise 實例
    let pAll = Promise.all([p1, p2, p3]);
    // 一個都不能少,每一個promise都要讀取成功才會成功,相當于是并且
    pAll.then((data) => {
      console.log(data);
    });
  • race

    const fs = require("fs");
    function getPromise(filename) {
      // 調用Promise構造函數,創建一個promise的實例
      return new Promise((resolve, reject) => {
        // 寫異步操作(讀文件)
        fs.readFile(`${__dirname}/etc/${filename}.txt`, "utf-8", (err, data) => {
          if (!err) {
            // 操作成功(讀文件成功)
            resolve(data); // 調用resolve方法
            // 調用then()里面的第一個參數函數
          } else {
            reject(err); // 調用reject方法
            // 調用then()里面的第二個參數函數
          }
        });
      });
    }
    
    let p1 = getPromise("a");
    let p2 = getPromise("b");
    let p3 = getPromise("c");
    
    // Promise.race()方法同樣是將多個 Promise 實例,包裝成一個新的 Promise 實例
    let pRace = Promise.race([p1, p2, p3]);
    // 只要有一個promise執行成功,那這個pRace就成功,相當于是或者
    pRace.then((data) => {
      console.log(data);
    });

上述就是小編為大家分享的Promise對象怎么在Nodejs中使用了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

南汇区| 措勤县| 萍乡市| 嘉兴市| 永泰县| 蓬安县| 望都县| 巴林右旗| 东阿县| 云浮市| 夏邑县| 巴塘县| 泸水县| 吴川市| 丹阳市| 吕梁市| 达孜县| 昆山市| 册亨县| 西峡县| 桦甸市| 台江县| 综艺| 得荣县| 宣化县| 钦州市| 田林县| 贵南县| 仙游县| 修武县| 祁连县| 建昌县| 两当县| 和硕县| 永平县| 文化| 房产| 伊金霍洛旗| 永修县| 双鸭山市| 大田县|