您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關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中使用了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。