摘要:立即執(zhí)行的驗(yàn)證的參數(shù)是異步調(diào)用的驗(yàn)證當(dāng)在中通過(guò)調(diào)用使?fàn)顟B(tài)穩(wěn)定之后,不管調(diào)用多少次,值都不會(huì)再發(fā)生變化一諾千金的優(yōu)點(diǎn)是什么我看了很多文章在介紹的時(shí)候都會(huì)提到回調(diào)噩夢(mèng)。
TL;DR
本文是對(duì) Promise 一些概念點(diǎn)的歸納和對(duì) Promise 在解決什么問(wèn)題的思考。
并不會(huì)介紹 Promise 的 Api。
一直想寫一篇關(guān)于 Promise 的文章,但覺(jué)得自己對(duì) Promise 是一知半解,始終擱置。前幾天剛好在看 Dr. Axel Rauschmayer 的『 Exploring ES6 』 這本書(shū)的時(shí)候,看到關(guān)于 Promise 的章節(jié),仔細(xì)讀了一遍,又動(dòng)手實(shí)現(xiàn)了簡(jiǎn)易版的 Promise 一遍,再印證其它的資料,這才開(kāi)始完成這篇文章。
要知道 Promise 哪些知識(shí)點(diǎn)const p = new Promise( function (resolve, reject) { // (A) ··· if (···) { resolve(value); // success } else { reject(reason); // failure } })
A 行的函數(shù)被稱為 executor
當(dāng)實(shí)例化一個(gè) Promise 的時(shí)候,executor 總是「立即執(zhí)行」的
Promises 總是異步執(zhí)行的。在 then 的消耗 Promise value 時(shí)候,會(huì)把 then 的參數(shù)放到任務(wù)隊(duì)列中,等待執(zhí)行。
當(dāng) Promise 中的狀態(tài)進(jìn)入穩(wěn)定態(tài)(settled)的時(shí)候,Promise 的值便不會(huì)再發(fā)生變化,這就是 Promise 的名稱由來(lái):承諾。
// executor 立即執(zhí)行的驗(yàn)證 new Promise( (res) => { console.log(1) setTimeout(() => console.log(3), 1000) }) console.log(2) // ------> 1 // ------> 2 // ------> 3 // then 的參數(shù)是異步調(diào)用的驗(yàn)證 new Promise( (res) => { res(2) }).then(v=> console.log(v)) console.log(1) // ------> 1 // ------> 2 // 當(dāng)在 executor 中通過(guò)調(diào)用 res 使?fàn)顟B(tài)穩(wěn)定之后,不管調(diào)用多少次 res,值都不會(huì)再發(fā)生變化 new Promise( (res) => { res(1) res(2) }).then(v=> console.log(v)) // ------> 1Promise -- 一諾千金
Promise 的優(yōu)點(diǎn)是什么?我看了很多文章在介紹 Promise 的時(shí)候都會(huì)提到回調(diào)噩夢(mèng)(Callback Hell)。然而我覺(jué)得 Promise 并沒(méi)有簡(jiǎn)單的解決回調(diào)噩夢(mèng)的問(wèn)題,寫 then 往往比寫 callback 更惡心。
在我看來(lái),Promise 提供了控制反轉(zhuǎn)的機(jī)會(huì)。
假設(shè)有下面這樣一個(gè)函數(shù),10 秒后調(diào)用傳入的 fn。這是一個(gè)你的同事提供給你的獨(dú)立文件。
// foo.js function foo(fn) { setTimeout(fn, 1000*10) } module.exports = foo
你在寫一個(gè) 10 秒之后打印 log 的業(yè)務(wù):
var foo = require("foo") foo(()=> console.log("hello,world!!"))
然而很不幸,你的同事離職,他的代碼被交給一個(gè)很笨的新同事維護(hù),新同事維護(hù)這個(gè)代碼的時(shí)候,不小心復(fù)制了一行代碼:
// foo.js function foo(fn) { setTimeout(fn, 1000*10) setTimeout(fn, 1000*10) } module.exports = foo
這時(shí)每次調(diào)用 foo 的時(shí)候,都會(huì)寫兩遍日志,不到 1 天服務(wù)器的硬盤就被撐爆了,用戶就不能訪問(wèn)網(wǎng)頁(yè)了,接著用戶就流失了,公司倒閉了,你就被失業(yè)了,想想都是很可怕的事情。這些都是因?yàn)槟惆涯愕暮瘮?shù)交給你的同事調(diào)用并且無(wú)條件信任他。
然而 Promise 會(huì)怎樣做?
// foo.js function foo() { return new Promise((res) => { setTimeout(res, 1000*2) }) } module.exports = foo // main.js var foo = require("foo") foo().then(()=> console.log("hello,world!!"))
那個(gè)笨同事又干了同樣的蠢事,這次他復(fù)制了三行:
// foo.js function foo() { return new Promise((res) => { setTimeout(res, 1000*10) setTimeout(res, 1000*10) setTimeout(res, 1000*10) }) } module.exports = foo
然而這次讓我失業(yè)的行為并沒(méi)有得逞,因?yàn)楫?dāng) Promise 的狀態(tài)穩(wěn)定之后,值就不會(huì)再改變,不管調(diào)用多少次 reslove 方法都是同樣的效果。Callback 會(huì)把你做的事情的權(quán)限交出去,你不再對(duì)你的函數(shù)有控制權(quán),而 Promise 是在等狀態(tài)穩(wěn)定之后才會(huì)再去執(zhí)行你自己的函數(shù),你對(duì)此函數(shù)擁有控制權(quán)。
不過(guò)說(shuō)到底,都沒(méi)有絕對(duì)的信任,也說(shuō)不定有人會(huì)把 Promise 的 then 實(shí)現(xiàn) hack 了,而這種惡意做法的成本要比他不小心多復(fù)制一行代碼的成本要高得多。
Exploring ES6
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/79528.html
摘要:瀏覽器對(duì)象可以獲取瀏覽器提供的很多對(duì)象,并進(jìn)行操作。對(duì)象不但充當(dāng)全局作用域,而且表示瀏覽器窗口。對(duì)象表示當(dāng)前頁(yè)面的信息。由于在瀏覽器中以形式表示為樹(shù)形結(jié)構(gòu),對(duì)象就是整個(gè)樹(shù)的根節(jié)點(diǎn)。這個(gè)行為由瀏覽器實(shí)現(xiàn),主流瀏覽器均支持選項(xiàng),從開(kāi)始支持。 由于JavaScript的出現(xiàn)就是為了能在瀏覽器中運(yùn)行,所以,瀏覽器自然是JavaScript開(kāi)發(fā)者必須要關(guān)注的?!緦懙谋容^多,難免有疏漏的地方,希望...
摘要:軟件測(cè)試零基礎(chǔ)學(xué)習(xí)難不難其實(shí),如果你想轉(zhuǎn)到行業(yè),其實(shí)軟件測(cè)試是最簡(jiǎn)單的學(xué)科之一,很適合零基礎(chǔ)學(xué)習(xí),只要你有一顆好奇的心肯學(xué)習(xí)的心和對(duì)軟件測(cè)試充滿興趣,難度不會(huì)太大。 ...
摘要:凡有所學(xué),皆成性格。關(guān)于作者陳光劍,江蘇東海人號(hào)行走江湖一劍客,字之劍。程序員,詩(shī)人作家。光劍免費(fèi)圖書(shū)館創(chuàng)始人天才郵箱如果您有好的書(shū)籍推薦請(qǐng)聯(lián)系我 WFeB全球免費(fèi)圖書(shū)館 World Free eBook 全球免費(fèi)開(kāi)放的電子圖書(shū)館(https://universsky.github.io/) 道之所在,雖千萬(wàn)人吾往矣;義之所當(dāng),千金散盡不后悔;情之所鐘,世俗禮法如糞土;興之所至,與君痛...
摘要:凡有所學(xué),皆成性格。關(guān)于作者陳光劍,江蘇東海人號(hào)行走江湖一劍客,字之劍。程序員,詩(shī)人作家。光劍免費(fèi)圖書(shū)館創(chuàng)始人天才郵箱如果您有好的書(shū)籍推薦請(qǐng)聯(lián)系我 WFeB全球免費(fèi)圖書(shū)館 World Free eBook 全球免費(fèi)開(kāi)放的電子圖書(shū)館(https://universsky.github.io/) 道之所在,雖千萬(wàn)人吾往矣;義之所當(dāng),千金散盡不后悔;情之所鐘,世俗禮法如糞土;興之所至,與君痛...
閱讀 3633·2023-04-25 23:32
閱讀 2048·2019-08-30 15:55
閱讀 2661·2019-08-30 15:52
閱讀 3120·2019-08-30 10:54
閱讀 848·2019-08-29 16:16
閱讀 657·2019-08-29 15:09
閱讀 3661·2019-08-26 14:05
閱讀 1642·2019-08-26 13:22