摘要:執(zhí)行完成接收一個函數作為參數,函數有兩個參數,和分別表示異步操作執(zhí)行后成功的回調函數和失敗的回調函數。所以通常采用一個函數包含它執(zhí)行完成可以使用異步操作中的數據執(zhí)行完調用方法,就相當于我們之前寫的回調函數。
基本概念
個人理解就是使用同步編程的寫法完成異步編程操作。
const promise = new Promise((resolve, reject) => { //some asynchronous code setTimeout(() => { console.log("執(zhí)行完成"); resolve("some data"); }, 2000); });
Promise 接收一個函數作為參數,函數有兩個參數,resolve 和 reject 分別表示異步操作執(zhí)行后成功的回調函數和失敗的回調函數。
Promise 實例后馬上執(zhí)行。所以通常采用一個函數包含它
function runAsync() { return new Promise((resolve, reject) => { //some asynchronous code setTimeout(() => { console.log("執(zhí)行完成"); resolve("some data"); }, 2000); }); } runAsync().then((data) => { console.log(data);//可以使用異步操作中的數據 })
runAsync() 執(zhí)行完調用 then 方法,then() 就相當于我們之前寫的回調函數。
resolve 和 rejectfunction paramTest(){ return new Promise((resolve, reject) => { let number = Math.ceil(Math.random() * 10); if (number < 5) { resolve(number); }else{ reject("out of range"); } }) } paramTest().then((number) => { console.log("resolved"); console.log(number); },(reason) => { console.log("rejected"); console.log(reason); })
Promise 有三種狀態(tài):pending(進行中)、fulfilled(已成功)和 rejected(已失?。?/p>
paramTest() 例子有兩種情況:
當 number < 5 時,我們認為是成功情況,將狀態(tài)從 pending 變?yōu)?fulfilled
當 number >= 5 時,我們認為是失敗情況,將狀態(tài)從 pending 變?yōu)?rejected
所以paramTest() 的執(zhí)行結果:
fulfilled | rejected |
---|---|
resolved | rejected |
number | out of range |
我們繼續(xù)調用 paramTest 方法舉例
paramTest().then((number) => { console.log("resolved"); console.log(number); console.log(data); //data為未定義 },(reason) => { console.log("rejected"); console.log(reason); }).catch((err) => { console.log(err); })
catch 方法其實就是 .then(null, rejection) 的別名,也是用來處理失敗失敗的回調函數,但是還有一個作用:當 resolve 回調中如果出現錯誤了,不會堵塞,會執(zhí)行 catch 中的回調。
all的用法const p = Promise.all([p1, p2, p3]); p.then(result => { console.log(result); })
all 方法接收一個數組參數,數組中每一項返回的都是 Promise 對象,只有當 p1, p2, p3 都執(zhí)行完才會進入 then 回調。p1, p2, p3 返回的數據會以一個數組的形式傳到 then 回調中。
const p1 = new Promise((resolve, reject) => { setTimeout(() => { resolve("p1"); }, 1000); }) .then(result => result) .catch(e => e); const p2 = new Promise((resolve, reject) => { setTimeout(() => { resolve("p2"); }, 3000); }) .then(result => result) .catch(e => e); Promise.all([p1, p2]) .then(result => console.log(result)) .catch(e => console.log(e)); //3秒后輸出["p1", "p2"]race的用法
const p = Promise.race([p1, p2, p3]); p.then(result => { console.log(result); })
race 的用法與 all 如出一轍,不同的是 all 方法需要參數的每一項都返回成功了才會執(zhí)行 then;而 race 則是只要參數中的某一項返回成功就執(zhí)行 then 回調。以下是 race 的例子,和 all 方法對比,可以看到返回值有很明顯的區(qū)別。
const p1 = new Promise((resolve, reject) => { setTimeout(() => { resolve("p1"); }, 1000); }) .then(result => result) .catch(e => e); const p2 = new Promise((resolve, reject) => { setTimeout(() => { resolve("p2"); }, 3000); }) .then(result => result) .catch(e => e); Promise.race([p1, p2]) .then(result => console.log(result)) .catch(e => console.log(e)); //1秒后輸出 "p1"
點擊這里查看本文中實例源代碼
resloader是基于Promise實現的一個圖片預加載并展示加載進度的插件,猛戳這里了解詳情。如果感覺還可以的話,歡迎star
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.hztianpu.com/yun/92984.html
摘要:不兼容問題,本文不予以處理,出門左轉,找谷哥。如果中的回調函數拋出一個錯誤,那么返回的將會成為拒絕狀態(tài),并且將拋出的錯誤作為拒絕狀態(tài)的回調函數的參數值。 Promise與async 主要內容: promise基本實現原理 promise 使用中難點(鏈式調用,API基本上返回都是一個新Promise,及參數傳遞) promise 對異常處理 參考: ? 30分鐘,讓你徹底明...
摘要:閱讀原文簡介是的新特性,提供了對異步編程控制的新的解決方案,在過去書寫異步代碼時要靠回調函數,當異步操作依賴于其他異步操作的返回值時,會出現一種現象,被程序員們稱為回調地獄,即多層回調函數嵌套,這種代碼的可讀性維護性都很差,因此誕生了,當然 showImg(https://segmentfault.com/img/remote/1460000018998462); 閱讀原文 Pro...
摘要:入門之基本用法背景在我們使用異步函數比如進行編寫代碼,如果我們需要很多個請求不同的接口,而下一個接口需要依賴上一個接口的返回值,這樣,我們的代碼則需要在各種回調函數中嵌套,這樣一層一層地下去,就形成了回調地獄。 Promise入門之基本用法 背景 在我們使用異步函數比如ajax進行編寫代碼,如果我們需要很多個ajax請求不同的接口,而下一個接口需要依賴上一個接口的返回值,這樣,我們的代...
摘要:今天來學習下吧其實這在筆試上也是一個考點基本介紹對象是熟悉的名字吧工作組提出的規(guī)范原本只是社區(qū)提出的構想一些外部函數庫率先實現了該功能中將其寫入了語言標準目的為異步操作提供統(tǒng)一接口是啥它就是一個中一個對象起著代理作用充當異步操作與回調函 今天來學習下Promise吧,其實這在筆試上也是一個考點. 基本介紹 Promise對象是CommonJS(熟悉的名字吧- -)工作組提出的規(guī)范.Pr...
摘要:追加在本輪循環(huán)的異步任務追加在次輪循環(huán)的異步任務規(guī)定,和的回調函數,追加在本輪循環(huán),即同步任務一旦執(zhí)行完成,就開始執(zhí)行它們。 author: 陳家賓 email: 617822642@qq.com date: 2018/2/23 Promise 基本實現 var PENDING = 0; var FULFILLED = 1; var REJECTED = 2; function Pr...
閱讀 3571·2021-11-18 10:02
閱讀 1668·2021-10-12 10:12
閱讀 3076·2021-10-09 09:53
閱讀 5154·2021-09-09 09:34
閱讀 1033·2021-09-06 15:02
閱讀 2839·2021-08-05 10:02
閱讀 3250·2019-08-30 15:44
閱讀 3179·2019-08-28 18:04