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

資訊專欄INFORMATION COLUMN

ECMAScript 6入門Promise對象

ingood / 523人閱讀

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

Promise對象

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

Promise是什么

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

Promise有什么用

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

Promise特點

摘自ES6入門

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

通過new構(gòu)造一個簡單的Promise對象

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

傳入的兩個參數(shù)是用來控制Promise對象的狀態(tài),我們打印一下p看一下它的狀態(tài):
Promise?{__proto__: Promise[[PromiseStatus]]: "pending"[[PromiseValue]]: undefined這個就是初始狀態(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()后是返回一個失敗狀態(tài)的Promise,不需要用catch來捕獲不寫catch會報錯
p.catch(data => console.log(data));    
console.log(p);    //Promise?{: "123"}   123

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

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的錯誤

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

因為then處理后返回的還是Promise對象,這樣方便鏈式調(diào)用,then中都沒有return,怎么會有Promise對象的呢?

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

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

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

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

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

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

第二值得注意的是具有then方法的對象

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

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

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

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對象
與resolve不同的是:直接將value原樣作為參數(shù)傳入

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

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

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

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

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

會等all中的對象全部執(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之中有一個實例率先改變狀態(tài),p的狀態(tài)就跟著改變。那個率先改變的 Promise 實例的返回值,就傳遞給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對象的回調(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)境) 遵循隊列先進先出原則, 依次遍歷macrotask queue中的每一個task, 不過每執(zhí)行一個macrotask, 并不是立即就執(zhí)行下一個, 而是執(zhí)行一遍microtask queue中的任務(wù), 然后切換GUI線程重新渲染或垃圾回收等.
Event Loop (事件循環(huán))擁有如下兩種隊列
macrotask queue, 指的是宏任務(wù)隊列, 包括rendering, script(頁面腳本), 鼠標(biāo), 鍵盤, 網(wǎng)絡(luò)請求等事件觸發(fā), setTimeout, setInterval, setImmediate(node)等等.
microtask queue, 指的是微任務(wù)隊列, 用于在瀏覽器重新渲染前執(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)”開始時執(zhí)行,Promise.resolve()在本輪“事件循環(huán)”結(jié)束時執(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)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/98640.html

相關(guān)文章

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

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

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

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

    mushang 評論0 收藏0
  • ES6-7

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

    mudiyouyou 評論0 收藏0
  • 前端 api 請求緩存方案

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

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

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

    YorkChen 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<