亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

ECMAScript 6入門Promise對(duì)象

ingood / 551人閱讀

摘要:對(duì)象的狀態(tài)不受外界影響。如果改變已經(jīng)發(fā)生了,你再對(duì)對(duì)象添加回調(diào)函數(shù),也會(huì)立即得到這個(gè)結(jié)果。會(huì)等中的對(duì)象全部執(zhí)行完后將數(shù)組傳入回調(diào)函數(shù)中與不同的是只要之中有一個(gè)實(shí)例率先改變狀態(tài),的狀態(tài)就跟著改變。

Promise對(duì)象

剛學(xué)習(xí)完,有點(diǎn)粗略印象。整理記錄一下以便后續(xù)學(xué)習(xí)補(bǔ)充,加深理解。

Promise是什么

Promise是構(gòu)造函數(shù),可以通過new來生成Promise對(duì)象。

Promise有什么用

目前我的感受是:更加方便來操作異步流程,更加明確直觀的控制事件的流程以及可以鏈?zhǔn)秸{(diào)用

Promise特點(diǎn)

摘自ES6入門

Promise對(duì)象有以下兩個(gè)特點(diǎn)。
(1)對(duì)象的狀態(tài)不受外界影響。Promise對(duì)象代表一個(gè)異步操作,有三種狀態(tài):pending(進(jìn)行中)、fulfilled(已成功)和rejected(已失敗)。只有異步操作的結(jié)果,可以決定當(dāng)前是哪一種狀態(tài),任何其他操作都無法改變這個(gè)狀態(tài)。這也是Promise這個(gè)名字的由來,它的英語意思就是“承諾”,表示其他手段無法改變。
(2)一旦狀態(tài)改變,就不會(huì)再變,任何時(shí)候都可以得到這個(gè)結(jié)果。Promise對(duì)象的狀態(tài)改變,只有兩種可能:從pending變?yōu)閒ulfilled和從pending變?yōu)閞ejected。只要這兩種情況發(fā)生,狀態(tài)就凝固了,不會(huì)再變了,會(huì)一直保持這個(gè)結(jié)果,這時(shí)就稱為 resolved(已定型)。如果改變已經(jīng)發(fā)生了,你再對(duì)Promise對(duì)象添加回調(diào)函數(shù),也會(huì)立即得到這個(gè)結(jié)果。這與事件(Event)完全不同,事件的特點(diǎn)是,如果你錯(cuò)過了它,再去監(jiān)聽,是得不到結(jié)果的。
通過幾個(gè)簡(jiǎn)單例子理解它

通過new構(gòu)造一個(gè)簡(jiǎn)單的Promise對(duì)象

let p = new Promise((resolve, reject) => {});

傳入的兩個(gè)參數(shù)是用來控制Promise對(duì)象的狀態(tài),我們打印一下p看一下它的狀態(tài):
Promise?{__proto__: Promise[[PromiseStatus]]: "pending"[[PromiseValue]]: undefined這個(gè)就是初始狀態(tài)pending
而resolve,reject可以控制Promise的狀態(tài)

//resolve()
let p = new Promise((resolve, reject) => resolve("123")); //Promise?{: "123"}
//reject()
let p = new Promise((resolve, reject) => reject("123")); //reject()后是返回一個(gè)失敗狀態(tài)的Promise,不需要用catch來捕獲不寫catch會(huì)報(bào)錯(cuò)
p.catch(data => console.log(data));    
console.log(p);    //Promise?{: "123"}   123

提到了catch那就有還有一個(gè)then
說一直白點(diǎn):then(f1, f2)可以填入兩個(gè)函數(shù)參數(shù),一個(gè)參數(shù)就是將resolve中參數(shù)代入f1來執(zhí)行,第二個(gè)參數(shù)將reject中參數(shù)代入f2來執(zhí)行;第二個(gè)參數(shù)可以用catch來代替,并且它更加強(qiáng)大,catch能捕獲then()中的報(bào)錯(cuò)

let p = new Promise((resolve, reject) => {
    
    let n = Math.ceil(Math.random() * 10);
    n > 5 ? resolve(n) : reject(n);
});
p.then(
    data => console.log(data),
    data => console.log(data),
)

用catch代替,并捕獲then的錯(cuò)誤

let p = new Promise((resolve, reject) => {
    
    resolve("yes")
});
p.then(
    data => {console.log(data),console.log(a)}

).catch(data => console.log(data));
//yes
//ReferenceError: a is not defined

因?yàn)閠hen處理后返回的還是Promise對(duì)象,這樣方便鏈?zhǔn)秸{(diào)用,then中都沒有return,怎么會(huì)有Promise對(duì)象的呢?

then或catch即使未顯式指定返回值, 它們也總是自動(dòng)包裝一個(gè)新的fulfilled狀態(tài)的promise對(duì)象。

我們打印一下會(huì)發(fā)現(xiàn):Promise?{: undefined}
那么我們可以顯示的return一個(gè)Promise對(duì)象看看,

let p = new Promise((resolve, reject) => resolve("yes"));
p.then(data => Promise.resolve("第二個(gè)Promise")).then(data => console.log(data));   //第二個(gè)Promise

可以看到p.then(data => Promise.resolve("第二個(gè)Promise"))返回Promise對(duì)象是Promise?{: "第二個(gè)Promise"}并且將value值作為參數(shù)傳入到第二個(gè)then中來執(zhí)行

Promise.resolve(value | promise | thenable)創(chuàng)建Promise對(duì)象
第一參數(shù)空或者原始值,創(chuàng)建后的Promise對(duì)象狀態(tài)直接為resolved狀態(tài)

Promise.resolve("f")
// 等價(jià)于
new Promise(resolve => resolve("f"))

第二值得注意的是具有then方法的對(duì)象

let thenable = {
    then :(resolve, reject) => resolve("thenable")
}

let p = Promise.resolve(thenable);
console.log(p);    

Promise對(duì)象狀態(tài)由->
第三參數(shù)為實(shí)例化的Promise對(duì)象,

let p1 = new Promise((resolve, reject) => false);
let p = Promise.resolve(p1);
console.log(p);

p狀態(tài)和p1狀態(tài)一致的

Promise.reject(value)創(chuàng)建Promise對(duì)象
與resolve不同的是:直接將value原樣作為參數(shù)傳入

const thenable = {
  then(resolve, reject) {
    reject("出錯(cuò)了");
  }
};

Promise.reject(thenable)
.catch(e => {
  console.log(e === thenable)
})

catch方法的參數(shù)不是reject拋出的“出錯(cuò)了”這個(gè)字符串,而是thenable對(duì)象。

Promise.all
將多個(gè) Promise 實(shí)例,包裝成一個(gè)新的 Promise 實(shí)例;const p = Promise.all([p1, p2, p3]);

(1)只有p1、p2、p3的狀態(tài)都變成fulfilled,p的狀態(tài)才會(huì)變成fulfilled,此時(shí)p1、p2、p3的返回值組成一個(gè)數(shù)組,傳遞給p的回調(diào)函數(shù)。(2)只要p1、p2、p3之中有一個(gè)被rejected,p的狀態(tài)就變成rejected,此時(shí)第一個(gè)被reject的實(shí)例的返回值,會(huì)傳遞給p的回調(diào)函數(shù)。

會(huì)等all中的對(duì)象全部執(zhí)行完后將數(shù)組傳入回調(diào)函數(shù)then中

let p = new Promise((resolve, reject) => setTimeout(() => resolve("p"),1000));
let p1 = new Promise((resolve, reject) => setTimeout(() => resolve("p2"),2000));
let p2 = new Promise((resolve, reject) => setTimeout(() => resolve("p3"),3000));
Promise.all([p, p1, p2]).then(data => console.log(data)).catch(data => console.log(data));    //?["p", "p2", "p2"]
let p = new Promise((resolve, reject) => resolve("p"));
let p1 = new Promise((resolve, reject) => reject("p2"));
let p2 = new Promise((resolve, reject) => resolve("p2"));
Promise.all([p, p1, p2]).then(data => console.log(data)).catch(data => console.log(data));   //p2

Promise.race
與all不同的是:只要p1、p2、p3之中有一個(gè)實(shí)例率先改變狀態(tài),p的狀態(tài)就跟著改變。那個(gè)率先改變的 Promise 實(shí)例的返回值,就傳遞給p的回調(diào)函數(shù)。

let p = new Promise((resolve, reject) => setTimeout(() => resolve("p"),1000));
let p1 = new Promise((resolve, reject) => setTimeout(() => resolve("p2"),2000));
let p2 = new Promise((resolve, reject) => setTimeout(() => resolve("p3"),3000));
Promise.race([p, p1, p2]).then(data => console.log(data)).catch(data => console.log(data));   //p

Promise對(duì)象的回調(diào)函數(shù)與setTimeout的順序問題

An event loop has one or more task queues. A task queue is an ordered list of tasks, which are algorithms that are responsible for such work as: events, parsing, callbacks, using a resource, reacting to DOM manipulation…Each event loop has a microtask queue. A microtask is a task that is originally to be queued on the microtask queue rather than a task queue.
瀏覽器(或宿主環(huán)境) 遵循隊(duì)列先進(jìn)先出原則, 依次遍歷macrotask queue中的每一個(gè)task, 不過每執(zhí)行一個(gè)macrotask, 并不是立即就執(zhí)行下一個(gè), 而是執(zhí)行一遍microtask queue中的任務(wù), 然后切換GUI線程重新渲染或垃圾回收等.
Event Loop (事件循環(huán))擁有如下兩種隊(duì)列
macrotask queue, 指的是宏任務(wù)隊(duì)列, 包括rendering, script(頁面腳本), 鼠標(biāo), 鍵盤, 網(wǎng)絡(luò)請(qǐng)求等事件觸發(fā), setTimeout, setInterval, setImmediate(node)等等.
microtask queue, 指的是微任務(wù)隊(duì)列, 用于在瀏覽器重新渲染前執(zhí)行, 包含Promise, process.nextTick(node), Object.observe, MutationObserver回調(diào)等.
process.nextTick > promise.then > setTimeout ? setImmediate
setTimeout(function () {
  console.log("three");
}, 0);

Promise.resolve().then(function () {
  console.log("two");
});

console.log("one");

// one
// two
// three

上面代碼中,setTimeout(fn, 0)在下一輪“事件循環(huán)”開始時(shí)執(zhí)行,Promise.resolve()在本輪“事件循環(huán)”結(jié)束時(shí)執(zhí)行,console.log("one")則是立即執(zhí)行,因此最先輸出。

setTimeout(function() {
  console.log(4)
}, 0);
new Promise(function(resolve) {
  console.log(1);
  for (var i = 0; i < 10000; i++) {
    i == 9999 && resolve()
  }
  console.log(2);
}).then(function() {
  console.log(5)
});
console.log(3);  //1 2 3 5 4 

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/98640.html

相關(guān)文章

  • 談?wù)凟S6前后的異步編程

    摘要:回調(diào)函數(shù)這是異步編程最基本的方法。對(duì)象對(duì)象是工作組提出的一種規(guī)范,目的是為異步編程提供統(tǒng)一接口。誕生后,出現(xiàn)了函數(shù),它將異步編程帶入了一個(gè)全新的階段。 更多詳情點(diǎn)擊http://blog.zhangbing.club/Ja... Javascript 語言的執(zhí)行環(huán)境是單線程的,如果沒有異步編程,根本沒法用,非卡死不可。 為了解決這個(gè)問題,Javascript語言將任務(wù)的執(zhí)行模式分成兩種...

    fizz 評(píng)論0 收藏0
  • 實(shí)現(xiàn) JavaScript 異步方法 Promise.all

    摘要:本次的任務(wù)假如。。。。。引擎發(fā)生了重大故障,方法變成了,為了拯救世界,需要開發(fā)一個(gè)模塊來解決此問題。實(shí)現(xiàn)首先要知道是什么是對(duì)異步編程的一種抽象。數(shù)組中任何一個(gè)為的話,則整個(gè)調(diào)用會(huì)立即終止,并返回一個(gè)的新的對(duì)象。 本次的任務(wù) 假如。。。。。 JavaScript v8 引擎發(fā)生了重大故障,Promise.all 方法變成了 undefined ,為了拯救 JavaScript 世界,需要...

    mushang 評(píng)論0 收藏0
  • ES6-7

    摘要:的翻譯文檔由的維護(hù)很多人說,阮老師已經(jīng)有一本關(guān)于的書了入門,覺得看看這本書就足夠了。前端的異步解決方案之和異步編程模式在前端開發(fā)過程中,顯得越來越重要。為了讓編程更美好,我們就需要引入來降低異步編程的復(fù)雜性。 JavaScript Promise 迷你書(中文版) 超詳細(xì)介紹promise的gitbook,看完再不會(huì)promise...... 本書的目的是以目前還在制定中的ECMASc...

    mudiyouyou 評(píng)論0 收藏0
  • 前端 api 請(qǐng)求緩存方案

    摘要:而緩存系統(tǒng)數(shù)據(jù),我采用另外的方案。調(diào)用方式第二次調(diào)用取得先前的方案二緩存方案一本身是不足的。當(dāng)前緩存中沒有該對(duì)進(jìn)行操作在請(qǐng)求回來后,如果出現(xiàn)問題,把從中刪除以避免第二次請(qǐng)求繼續(xù)出錯(cuò)返回該代碼避免了方案一的同一時(shí)間多次請(qǐng)求的問題。 在開發(fā) web 應(yīng)用程序時(shí),性能都是必不可少的話題。對(duì)于webpack打包的單頁面應(yīng)用程序而言,我們可以采用很多方式來對(duì)性能進(jìn)行優(yōu)化,比方說 tree-sha...

    Binguner 評(píng)論0 收藏0
  • 前端培訓(xùn)-初級(jí)階段(13、18)

    摘要:年月歐洲計(jì)算機(jī)制造商協(xié)會(huì)發(fā)表了標(biāo)準(zhǔn),它是的一個(gè)擴(kuò)延,它也被稱為年月首版年月日截止發(fā)布日期,的官方名稱是,國(guó)際意在更頻繁地發(fā)布包含小規(guī)模增量更新的新版本,下一版本將于年發(fā)布,命名為。 前端最基礎(chǔ)的就是 HTML+CSS+Javascript。掌握了這三門技術(shù)就算入門,但也僅僅是入門,現(xiàn)在前端開發(fā)的定義已經(jīng)遠(yuǎn)遠(yuǎn)不止這些。前端小課堂(HTML/CSS/JS),本著提升技術(shù)水平,打牢基礎(chǔ)知識(shí)的...

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

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

0條評(píng)論

閱讀需要支付1元查看
<