網(wǎng)站做360推廣需要什么條件廊坊關(guān)鍵詞排名優(yōu)化
?難點圖解:then()方法
ES6學(xué)習(xí)網(wǎng)站:ES6 入門教程
解決:回調(diào)地獄(回調(diào)函數(shù)中嵌套回調(diào))
兩個特點:
(1)對象的狀態(tài)不受外界影響。Promise
對象代表一個異步操作,有三種狀態(tài):pending
(進行中)、fulfilled
(已成功)和rejected
(已失敗)。只有異步操作的結(jié)果,可以決定當前是哪一種狀態(tài),任何其他操作都無法改變這個狀態(tài)。
(2)一旦狀態(tài)改變,就不會再變,任何時候都可以得到這個結(jié)果。Promise
對象的狀態(tài)改變,只有兩種可能:從pending
變?yōu)?code>fulfilled和從pending
變?yōu)?strong>rejected
。只要這兩種情況發(fā)生,狀態(tài)就凝固了,不會再變了,會一直保持這個結(jié)果,這時就稱為 resolved(已定型)。如果改變已經(jīng)發(fā)生了,你再對Promise
對象添加回調(diào)函數(shù),也會立即得到這個結(jié)果。這與事件(Event)完全不同,事件的特點是,如果你錯過了它,再去監(jiān)聽,是得不到結(jié)果的。
創(chuàng)建 Promise
你可以使用 new Promise()
構(gòu)造函數(shù)來創(chuàng)建一個 Promise。它接受一個帶有 resolve
和 reject
兩個參數(shù)的函數(shù),這個函數(shù)會在異步操作完成(成功或失敗)時被調(diào)用。
let myPromise = new Promise((resolve, reject) => {
? // 異步操作
? setTimeout(() => {
? ? let success = true;
? ? if (success) {
? ? ? resolve("操作成功!"); // 成功時調(diào)用 resolve,狀態(tài)fulfill且改變當前promise對象的結(jié)果
? ? } else {
? ? ? reject("操作失敗!"); // 失敗時調(diào)用 reject
? ? }
? }, 2000); // 模擬2秒延遲
});
? Promise原型的方法
then()
p.then(value)=>{console.log('value')},成功調(diào)用時執(zhí)行,resolve()類似聲明,將形參傳給then()方法
在then()方法的參數(shù)函數(shù)中,通過形參使用promise對象的結(jié)果
如果promise的狀態(tài)不改變,then()里的方法不會執(zhí)行
使用return會將當前promise實例的狀態(tài)改成fulfilled,return返回值將作為形參傳給下一個then()
如果當前then()中代碼出錯,會將promise實例的狀態(tài)改成rejected
catch()
catch(),失敗調(diào)用時執(zhí)行
何時觸發(fā)?reject()或者Promise執(zhí)行體中有錯
處理 Promise
使用 then()
方法來處理 Promise 對象的成功完成情況,并使用 catch()
方法來處理失敗情況。
myPromise.then((message) => {
? console.log("成功:", message); // Promise 被 resolve 時執(zhí)行
}).catch((error) => {
? console.error("錯誤:", error); // Promise 被 reject 時執(zhí)行
});
?上邊說到Promise是一個構(gòu)造函數(shù),new之后等于說調(diào)用了構(gòu)造函數(shù),構(gòu)造函數(shù)中傳的參數(shù)是一個函數(shù),這個函數(shù)內(nèi)的兩個參數(shù)分別又是兩個函數(shù)(
reslove
和reject
)
Promise 鏈?
Promise 可以通過鏈式調(diào)用進一步簡化處理多個異步操作的代碼。在 then()
方法中返回一個新的 Promise對象,狀態(tài)為pending,可以使得鏈式調(diào)用變得更加清晰。
// 假設(shè)有一個函數(shù) fetchUserData 返回一個 Promise,用于獲取用戶數(shù)據(jù)
fetchUserData()
? .then((userData) => {
? ? // 處理獲取到的用戶數(shù)據(jù)
? ? return fetchUserPosts(userData.userId); // 返回另一個 Promise
? })
? .then((userPosts) => {
? ? // 處理獲取到的用戶發(fā)帖數(shù)據(jù)
? })
? .catch((error) => {
? ? console.error("處理過程中出現(xiàn)錯誤:", error);
? });
?Promise.all?
Promise.all()
用于同時處理多個 Promise,并在所有 Promise 都成功時返回一個包含所有結(jié)果的 Promise,但只要有一個 Promise 失敗,它就會立即返回失敗。
let promise1 = someAsyncOperation();
let promise2 = anotherAsyncOperation();Promise.all([promise1, promise2])
? .then((results) => {
? ? // results 包含了兩個 Promise 的結(jié)果
? })
? .catch((error) => {
? ? // 處理失敗情況
? });
Promise.race
?Promise.race()
用于競爭多個 Promise,返回一個新的 Promise,其結(jié)果由最先完成的 Promise 決定
let promise1 = fetchUserData();
let promise2 = new Promise((resolve, reject) => {
? setTimeout(() => {
? ? reject("操作超時!");
? }, 500); // 模擬超時操作
});Promise.race([promise1, promise2])
? .then((result) => {
? ? // 處理最先完成的 Promise 的結(jié)果
? })
? .catch((error) => {
? ? // 處理失敗情況,可能是超時或其他原因
? });
?
?
?