做劇情網(wǎng)站侵權(quán)嗎簡(jiǎn)述網(wǎng)絡(luò)營(yíng)銷的方法
Promise 是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調(diào)函數(shù)和事件——更合理和更強(qiáng)大。它由社區(qū)最早提出和實(shí)現(xiàn),ES6 將其寫進(jìn)了語言標(biāo)準(zhǔn),統(tǒng)一了用法,原生提供了 Promise 對(duì)象。
Promise 對(duì)象有以下兩個(gè)特點(diǎn)。
-
對(duì)象的狀態(tài)不受外界影響。 Promise 對(duì)象代表一個(gè)異步操作,有三種狀態(tài):pending(進(jìn)行中)、fulfilled(已成功)和rejected(已失敗)。只有異步操作的結(jié)果,可以決定當(dāng)前是哪一種狀態(tài),任何其他操作都無法改變這個(gè)狀態(tài)。這也是 Promise 這個(gè)名字的由來,它的英語意思就是“承諾”,表示其他手段無法改變。
-
一旦狀態(tài)改變,就不會(huì)再變,任何時(shí)候都可以得到這個(gè)結(jié)果。 Promise 對(duì)象的狀態(tài)改變,只有兩種可能:從 pending 變?yōu)?fulfilled 和從 pending 變?yōu)?rejected 。只要這兩種情況發(fā)生,狀態(tài)就凝固了,不會(huì)再變了,會(huì)一直保持這個(gè)結(jié)果,這時(shí)就稱為 resolved(已定型)。如果改變已經(jīng)發(fā)生了,你再對(duì) Promise 對(duì)象添加回調(diào)函數(shù),也會(huì)立即得到這個(gè)結(jié)果。這與事件(Event)完全不同,事件的特點(diǎn)是,如果你錯(cuò)過了它,再去監(jiān)聽,是得不到結(jié)果的。
Promise 有幾種靜態(tài)方法和實(shí)例方法。
靜態(tài)方法:
- Promise.resolve(value): 返回一個(gè)以給定值解析為成功的 Promise 對(duì)象。
- Promise.reject(reason): 返回一個(gè)由于給定原因而拒絕的 Promise 對(duì)象。
- Promise.all(iterable): 接收一個(gè)可迭代對(duì)象,所有輸入的 promise 都成功時(shí)返回一個(gè) promise,其結(jié)果為一個(gè)數(shù)組,包含所有輸入 promise 的結(jié)果。如果任何一個(gè)輸入 promise 失敗,則立即拒絕。
- Promise.race(iterable): 接收一個(gè)可迭代對(duì)象,一旦其中一個(gè) promise 解決或拒絕,就返回一個(gè) promise,其結(jié)果或拒絕理由與第一個(gè)解決或拒絕的 promise 相同。
- Promise.allSettled(iterable): 接收一個(gè)可迭代對(duì)象,等待所有的 promise 都完成(無論是解決還是拒絕),然后返回一個(gè) promise,其結(jié)果為一個(gè)數(shù)組,包含每個(gè) promise 的狀態(tài)。
實(shí)例方法(Promise.prototype):
- .then(onFulfilled, onRejected): 注冊(cè)當(dāng) promise 解決或拒絕時(shí)的回調(diào)函數(shù)。onFulfilled 在 promise 成功時(shí)調(diào)用,onRejected 在 promise 失敗時(shí)調(diào)用。返回一個(gè)新的 promise。
- .catch(onRejected): 添加一個(gè)處理 promise 失敗情況的回調(diào)函數(shù)。返回一個(gè)新的 promise。
- .finally(onFinally): 注冊(cè)一個(gè)在 promise 完成(無論成功或失敗)后執(zhí)行的回調(diào)函數(shù)。返回一個(gè)新的 promise。
用例:
// 使用 Promise.resolve 創(chuàng)建一個(gè)成功的 promise
let resolvedPromise = Promise.resolve("Success");// 使用 Promise.reject 創(chuàng)建一個(gè)失敗的 promise
let rejectedPromise = Promise.reject("Failure");// 使用 Promise.all 等待多個(gè) promise 完成
Promise.all([resolvedPromise, rejectedPromise]).then(results => console.log(results)).catch(error => console.error(error));// 使用 Promise.race 等待最快完成的 promise
Promise.race([resolvedPromise, rejectedPromise]).then(value => console.log(value)).catch(error => console.error(error));// 使用 Promise.allSettled 等待所有 promise 完成,不論成功或失敗
Promise.allSettled([resolvedPromise, rejectedPromise]).then(results => console.log(results)); // 輸出每個(gè) promise 的狀態(tài)// 使用 Promise.prototype.then 注冊(cè)回調(diào)
let promise = new Promise((resolve, reject) => {resolve("Done");
});
promise.then(value => {console.log(value); // 輸出:Done
});// 使用 Promise.prototype.catch 處理錯(cuò)誤
promise.then(() => {throw new Error("An error occurred");
}).catch(error => {console.error(error.message); // 輸出:An error occurred
});// 使用 Promise.prototype.finally 注冊(cè)最終回調(diào)
promise.finally(() => {console.log("This is the final step.");
});