摘要:簡介是一個構(gòu)造函數(shù),既然是構(gòu)造函數(shù),那么,我們就可以得到一個的實例在上,有兩個函數(shù),分別叫做成功之后的回調(diào)函數(shù)和失敗之后的回調(diào)函數(shù)在構(gòu)造函數(shù)的屬性上,有一個方法,也就說,只要是構(gòu)造函數(shù)創(chuàng)建的實例,都可以訪問到方法表示一個異步操作每當(dāng)我們一個
簡介
Promise 是一個 構(gòu)造函數(shù),既然是構(gòu)造函數(shù), 那么,我們就可以 new Promise() 得到一個 Promise 的實例;
在 Promise 上,有兩個函數(shù),分別叫做 resolve(成功之后的回調(diào)函數(shù)) 和 reject(失敗之后的回調(diào)函數(shù))
在 Promise 構(gòu)造函數(shù)的 Prototype 屬性上,有一個 .then() 方法,也就說,只要是 Promise 構(gòu)造函數(shù)創(chuàng)建的實例,都可以訪問到 .then() 方法
Promise 表示一個 異步操作;每當(dāng)我們 new 一個 Promise 的實例,這個實例,就表示一個具體的異步操作;
既然 Promise 創(chuàng)建的實例,是一個異步操作,那么,這個 異步操作的結(jié)果,只能有兩種狀態(tài):
狀態(tài)1: 異步執(zhí)行成功了,需要在內(nèi)部調(diào)用 成功的回調(diào)函數(shù) resolve 把結(jié)果返回給調(diào)用者;
狀態(tài)2: 異步執(zhí)行失敗了,需要在內(nèi)部調(diào)用 失敗的回調(diào)函數(shù) reject 把結(jié)果返回給調(diào)用者;
由于 Promise 的實例,是一個異步操作,所以,內(nèi)部拿到 操作的結(jié)果后,無法使用 return 把操作的結(jié)果返回給調(diào)用者; 這時候,只能使用回調(diào)函數(shù)的形式,來把 成功 或 失敗的結(jié)果,返回給調(diào)用者;
我們可以在 new 出來的 Promise 實例上,調(diào)用 .then() 方法,【預(yù)先】 為 這個 Promise 異步操作,指定 成功(resolve) 和 失?。╮eject) 回調(diào)函數(shù);
舉個例子</>復(fù)制代碼
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的內(nèi)部執(zhí)行順序
用Promise的 .then() 方法解決地獄回調(diào)
</>復(fù)制代碼
注意: Promise的 reject 部分傳入的函數(shù)可以為空,即可不寫文件讀取失敗后的操作,
</>復(fù)制代碼
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中的異常處理
情況一:在讀取文件出錯的部分報錯,但不影響后方代碼的執(zhí)行
</>復(fù)制代碼
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執(zhí)行失敗,就停止運行后面的方法(catch捕獲機制)
</>復(fù)制代碼
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);
})
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/99659.html
摘要:回調(diào)地獄的問題在于寫法過于繁瑣不夠優(yōu)雅代碼維護炒雞蛋疼,所以一直被前端程序猿所詬病,尤其是維護類似代碼的時候簡直日了一群哈士奇。,對象狀態(tài)以和為分水嶺。方法返回一個帶有拒絕原因參數(shù)的對象摘自對的解釋。并且返回的也是一個對象。 這是一段旁白 異步虐我千百遍,我待異步如初戀?。∽銮岸说耐瑢W(xué)做異步肯定都不陌生。因為JavaScript是單線程語言(也就是說不支持多線程編程,這不是廢話么啊喂!...
摘要:缺點無法取消當(dāng)處于狀態(tài)時,無法得知目前進展到哪一個階段錯誤不能被生成器什么是函數(shù)是提供的一種異步編程解決方案,語法行為與傳統(tǒng)函數(shù)完全不同函數(shù)有多種理解角度。 JavaScript的執(zhí)行機制在上篇文章中進行了深入的探討,那么既然是一門單線程語言,如何進行良好體驗的異步編程呢 回調(diào)函數(shù)Callbacks 當(dāng)程序跑起來時,一般情況下,應(yīng)用程序(application program)會時常通...
摘要:缺點無法取消當(dāng)處于狀態(tài)時,無法得知目前進展到哪一個階段錯誤不能被生成器什么是函數(shù)是提供的一種異步編程解決方案,語法行為與傳統(tǒng)函數(shù)完全不同函數(shù)有多種理解角度。 JavaScript的執(zhí)行機制在上篇文章中進行了深入的探討,那么既然是一門單線程語言,如何進行良好體驗的異步編程呢 回調(diào)函數(shù)Callbacks 當(dāng)程序跑起來時,一般情況下,應(yīng)用程序(application program)會時常通...
閱讀 3686·2021-10-11 10:58
閱讀 2267·2021-10-08 10:05
閱讀 2059·2021-09-27 13:34
閱讀 3600·2019-08-30 15:53
閱讀 2747·2019-08-30 14:02
閱讀 3588·2019-08-29 16:55
閱讀 640·2019-08-29 15:41
閱讀 1092·2019-08-29 15:23