成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Promise--一諾千金

xiongzenghui / 538人閱讀

摘要:立即執(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))
// ------> 1
Promise -- 一諾千金

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

相關(guān)文章

  • JavaScript簡(jiǎn)明教程之瀏覽器,前端程序猿必看

    摘要:瀏覽器對(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)注的?!緦懙谋容^多,難免有疏漏的地方,希望...

    _ivan 評(píng)論0 收藏0
  • 零基礎(chǔ)學(xué)習(xí)軟件測(cè)試難不難?

    摘要:軟件測(cè)試零基礎(chǔ)學(xué)習(xí)難不難其實(shí),如果你想轉(zhuǎn)到行業(yè),其實(shí)軟件測(cè)試是最簡(jiǎn)單的學(xué)科之一,很適合零基礎(chǔ)學(xué)習(xí),只要你有一顆好奇的心肯學(xué)習(xí)的心和對(duì)軟件測(cè)試充滿興趣,難度不會(huì)太大。 ...

    Jochen 評(píng)論0 收藏0
  • WFeB全球免費(fèi)圖書(shū)館 World Free eBook

    摘要:凡有所學(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),千金散盡不后悔;情之所鐘,世俗禮法如糞土;興之所至,與君痛...

    melody_lql 評(píng)論0 收藏0
  • WFeB全球免費(fèi)圖書(shū)館 World Free eBook

    摘要:凡有所學(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),千金散盡不后悔;情之所鐘,世俗禮法如糞土;興之所至,與君痛...

    elliott_hu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<