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