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

資訊專欄INFORMATION COLUMN

JavaScript中的promise使用

phodal / 644人閱讀

摘要:它的作用是為實例添加狀態(tài)改變時的回調函數(shù)。方法方法是的別名,用于指定發(fā)生錯誤時的回調函數(shù)。是一個處理和前一個回調函數(shù)運行時發(fā)生的錯誤發(fā)生錯誤比較推薦的書寫方法是先使用來給添加的回調,然后使用來捕獲所有的鏈接上的或者異常。

promise初始

Promise 是異步編程的一種解決方案,Promise 可以認為是一個對象,從它可以獲取異步操作的消息。Promise 提供統(tǒng)一的 API,各種異步操作都可以用同樣的方法進行處理。具有兩大特點:

對象的狀態(tài)不受外界影響。Promise對象代表一個異步操作,有三種狀態(tài):pending(進行中)、fulfilled(已成功)和rejected(已失?。?,只有promise執(zhí)行的結果可以影響當前狀態(tài),無論是異步操作還是同步操作。

一旦狀態(tài)改變,就不會再變,任何時候都可以得到這個結果。Promise對象的狀態(tài)改變,只有兩種可能:從pending變?yōu)閒ulfilled和從pending變?yōu)閞ejected。

基本用法

ES6 規(guī)定,Promise對象是一個構造函數(shù),用來生成Promise實例。

new Promise(
    /* executor */
    function(resolve, reject) {...}
);

Promise構造函數(shù)接受一個函數(shù)作為參數(shù),該函數(shù)的兩個參數(shù)分別是resolve和reject。它們是兩個函數(shù),由 JavaScript 引擎提供,不用自己部署??匆粋€實例:

let promise = new Promise(function(resolve, reject) {
  console.log("Promise");
  resolve();
});

promise.then(function() {
  console.log("resolved.");
});

console.log("Hi!");

// Promise
// Hi!
// resolved

可以看到,在new promise的時候,會立即執(zhí)行promise構造函數(shù)中的參數(shù)function,也就是包含resolve、reject兩個方法的函數(shù)會被立即執(zhí)行,上面代碼中,Promise 新建后立即執(zhí)行,所以首先輸出的是Promise。然后,then方法指定的回調函數(shù),將在當前腳本所有同步任務執(zhí)行完才會執(zhí)行,所以resolved最后輸出。
注意:
1. promise的參數(shù)函數(shù)中如果resolve、reject這兩個函數(shù)中的某個帶了參數(shù)也是 promise的話,那么這個原本的promise的狀態(tài)將會由參數(shù)中的promise的狀態(tài)決定
2. resolve、reject并不會想return一樣結束函數(shù)的運行

then方法

then方法是定義在原型對象Promise.prototype上的。它的作用是為 Promise 實例添加狀態(tài)改變時的回調函數(shù)。then方法的第一個參數(shù)是resolved狀態(tài)的回調函數(shù),第二個參數(shù)(可選)是rejected狀態(tài)的回調函數(shù)。then方法返回的是一個新的Promise實例(注意,不是原來那個Promise實例)。因此可以采用鏈式寫法,即then方法后面再調用另一個then方法。

// getJSON 是一個promise實例
getJSON("/posts.json").then(function(json) {
  return json.post;
}).then(function(post) {
  // ...
});

很多時候在then中會人為的書寫一些異步操作,這樣可以很好的鏈式調用,但是即使不是人為的異步操作,JavaScript也會自動的把then的返回值封裝為promise實例,可以一直使用then無限回調。

catch方法

Promise.prototype.catch方法是.then(null, rejection)的別名,用于指定發(fā)生錯誤時的回調函數(shù)。如果異步操作拋出錯誤,狀態(tài)就會變?yōu)閞ejected,就會調用catch方法指定的回調函數(shù),處理這個錯誤。另外,then方法指定的回調函數(shù),如果運行中拋出錯誤,也會被catch方法捕獲。

//getJSON 是一個promise
getJSON("/posts.json").then(function(posts) {
  // ...
}).catch(function(error) {
  // 處理 getJSON 和 前一個回調函數(shù)運行時發(fā)生的錯誤
  console.log("發(fā)生錯誤!", error);
});

比較推薦的書寫方法是先使用then來給promise添加resolve的回調,然后使用catch來捕獲所有的鏈接上的reject或者異常。

promise.resolve理解

可以說Promise.resolve是唯一的把promise轉換為完成狀態(tài)的操作,Promise.resolve方法的參數(shù)分成四種情況:

參數(shù)是一個promise實例
如果參數(shù)是Promise實例,那么Promise.resolve將不做任何修改、原封不動地返回這個實例。這個之前已經說過了,如果promise的的resolve參數(shù)帶的是一個promise,那么原本promise的將會被丟棄,由這個新的promise的狀態(tài)來取代

參數(shù)是一個thenable對象
thenable對象指的是具有then方法的對象,Promise.resolve方法會將這個對象轉為Promise對象,然后就立即執(zhí)行thenable對象的then方法。

參數(shù)不是具有then方法的對象,或根本就不是對象
如果參數(shù)是一個原始值,或者是一個不具有then方法的對象,則Promise.resolve方法返回一個新的Promise對象,狀態(tài)為resolved。

不帶有任何參數(shù)
Promise.resolve方法允許調用時不帶參數(shù),直接返回一個resolved狀態(tài)的Promise對象。

promise.reject理解

Promise.reject(reason)方法也會返回一個新的 Promise 實例,該實例的狀態(tài)為rejected。
注意,Promise.reject()方法的參數(shù),會原封不動地作為reject的理由,變成后續(xù)方法的參數(shù)。這一點與Promise.resolve方法不一致。

其他

done()
Promise對象的回調鏈,不管以then方法或catch方法結尾,要是最后一個方法拋出錯誤,都有可能無法捕捉到(因為Promise內部的錯誤不會冒泡到全局)。因此,我們可以提供一個done方法,總是處于回調鏈的尾端,保證拋出任何可能出現(xiàn)的錯誤。

done()
finally方法用于指定不管Promise對象最后狀態(tài)如何,都會執(zhí)行的操作。它與done方法的最大區(qū)別,它接受一個普通的回調函數(shù)作為參數(shù),該函數(shù)不管怎樣都必須執(zhí)行。

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

轉載請注明本文地址:http://systransis.cn/yun/88889.html

相關文章

  • JavaScript 異步

    摘要:從最開始的到封裝后的都在試圖解決異步編程過程中的問題。為了讓編程更美好,我們就需要引入來降低異步編程的復雜性。寫一個符合規(guī)范并可配合使用的寫一個符合規(guī)范并可配合使用的理解的工作原理采用回調函數(shù)來處理異步編程。 JavaScript怎么使用循環(huán)代替(異步)遞歸 問題描述 在開發(fā)過程中,遇到一個需求:在系統(tǒng)初始化時通過http獲取一個第三方服務器端的列表,第三方服務器提供了一個接口,可通過...

    tuniutech 評論0 收藏0
  • JavaScript引擎是如何工作的?從調用棧到Promise你需要知道的一切

    摘要:最受歡迎的引擎是,在和中使用,用于,以及所使用的。怎么處理每個引擎都有一個基本組件,稱為調用棧。也就是說,如果有其他函數(shù)等待執(zhí)行,函數(shù)是不能離開調用棧的。每個異步函數(shù)在被送入調用棧之前必須通過回調隊列。例如方法是在中傳遞的回調函數(shù)。 ? 翻譯:瘋狂的技術宅 原文:www.valentinog.com/blog/engine… 從Call Stack,Global Me...

    zzbo 評論0 收藏0
  • JavaScript引擎是如何工作的?從調用棧到Promise你需要知道的一切

    摘要:最受歡迎的引擎是,在和中使用,用于,以及所使用的。單線程的我們說是單線程的,因為有一個調用棧處理我們的函數(shù)。也就是說,如果有其他函數(shù)等待執(zhí)行,函數(shù)是不能離開調用棧的。每個異步函數(shù)在被送入調用棧之前必須通過回調隊列。 翻譯:瘋狂的技術宅原文:https://www.valentinog.com/bl... 本文首發(fā)微信公眾號:前端先鋒歡迎關注,每天都給你推送新鮮的前端技術文章 sh...

    Simon_Zhou 評論0 收藏0
  • ES6-7

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

    mudiyouyou 評論0 收藏0
  • 理解 Javascript 中的 Promise

    摘要:理解承諾有兩個部分。如果異步操作成功,則通過的創(chuàng)建者調用函數(shù)返回預期結果,同樣,如果出現(xiàn)意外錯誤,則通過調用函數(shù)傳遞錯誤具體信息。這將與理解對象密切相關。這個函數(shù)將創(chuàng)建一個,該將在到秒之間的隨機數(shù)秒后執(zhí)行或。 想閱讀更多優(yōu)質文章請猛戳GitHub博客,一年百來篇優(yōu)質文章等著你! showImg(https://segmentfault.com/img/bVbkNvF?w=1280&h=...

    paulli3 評論0 收藏0
  • 理解 Javascript 中的 Promise

    摘要:理解承諾有兩個部分。如果異步操作成功,則通過的創(chuàng)建者調用函數(shù)返回預期結果,同樣,如果出現(xiàn)意外錯誤,則通過調用函數(shù)傳遞錯誤具體信息。這將與理解對象密切相關。這個函數(shù)將創(chuàng)建一個,該將在到秒之間的隨機數(shù)秒后執(zhí)行或。 想閱讀更多優(yōu)質文章請猛戳GitHub博客,一年百來篇優(yōu)質文章等著你! showImg(https://segmentfault.com/img/bVbkNvF?w=1280&h=...

    chaos_G 評論0 收藏0

發(fā)表評論

0條評論

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