這篇文章主要介紹“Nodejs異步編程中的Promise有什么作用”,在日常操作中,相信很多人在Nodejs異步編程中的Promise有什么作用問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Nodejs異步編程中的Promise有什么作用”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
在柞水等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專(zhuān)注、極致的服務(wù)理念,為客戶(hù)提供網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作 網(wǎng)站設(shè)計(jì)制作按需求定制制作,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),網(wǎng)絡(luò)營(yíng)銷(xiāo)推廣,外貿(mào)網(wǎng)站制作,柞水網(wǎng)站建設(shè)費(fèi)用合理。
Promise 是一種異步編程的解決方案!
當(dāng)前事件循環(huán)得不到的結(jié)果,但未來(lái)的事件循環(huán)會(huì)給到你結(jié)果
是一個(gè)狀態(tài)機(jī)
pengding
resolved
reejectd
(function () { const res = new Promise((resolve, reject) => { setTimeout(() => { resolve(); }, 500); }); console.log("500ms", res); setTimeout(() => { console.log("800ms", res); }, 800); })();
打印出如下內(nèi)容
結(jié)果是符合我們的預(yù)期的
我們無(wú)法立即獲取promise
的結(jié)果,此時(shí)promise
處于pending
狀態(tài)
必須等待一段時(shí)間過(guò)后才能獲取promise
的結(jié)果,此時(shí)promise
處于fulfilled
狀態(tài)
(function () { const res = new Promise((resolve, reject) => { setTimeout(() => { reject(new Error("error")); }, 500); }); console.log("500ms", res); setTimeout(() => { console.log("800ms", res); }, 800); })();
打印出如下內(nèi)容
結(jié)果是符合我們的預(yù)期的
我們無(wú)法立即獲取promise
的結(jié)果,此時(shí)promise
處于pending
狀態(tài)
必須等待一段時(shí)間過(guò)后才能獲取promise
的結(jié)果,此時(shí)promise
處于reject
狀態(tài)
注意:如果當(dāng)
pengding
狀態(tài)進(jìn)入到reject
狀態(tài),這個(gè)錯(cuò)誤又沒(méi)有正確捕獲的話(huà),這個(gè)錯(cuò)誤就會(huì)被拋到 JS 的全局
(function () { const res = new Promise((resolve, reject) => { setTimeout(() => { resolve(); }, 300); setTimeout(() => { reject(new Error("error")); }, 500); }); console.log("500ms", res); setTimeout(() => { console.log("800ms", res); }, 800); })();
打印出如下內(nèi)容
可以發(fā)現(xiàn)!
在 300ms 的時(shí)候promise
的狀態(tài)已經(jīng)切換到了resolve
, 切換后永遠(yuǎn)也無(wú)法到達(dá)reject
狀態(tài)
pending
只能流轉(zhuǎn)到 resolve
或者 reject
;
resolve
和 reject
不能互相流轉(zhuǎn);
(function () { const res = new Promise((resolve, reject) => { setTimeout(() => { resolve(3); }, 300); }) .then((result) => { console.log("result", result); }) .catch((error) => { console.log("error", error); }); console.log("300ms", res); setTimeout(() => { console.log("800ms", res); }, 800); })();
打印出如下內(nèi)容
可以發(fā)現(xiàn)
then
是 promise
的狀態(tài)流轉(zhuǎn)到 reslove
狀態(tài)可以拿到的結(jié)果
(function () { const res = new Promise((resolve, reject) => { setTimeout(() => { reject(new Error("error-3")); }, 300); }) .then((result) => { console.log("result", result); }) .catch((error) => { console.log("error", error); }); console.log("300ms", res); setTimeout(() => { console.log("800ms", res); }, 800); })();
打印出如下內(nèi)容
可以發(fā)現(xiàn)
catch
是 promise
的狀態(tài)流轉(zhuǎn)到 reject
狀態(tài)可以拿到的結(jié)果, 并且之前全局的 JS 錯(cuò)誤已經(jīng)可以被 catch
捕獲到了
.then .catch 總結(jié)
resolved
狀態(tài)的 Promise 會(huì)回調(diào)后面的第一個(gè) .then
rejected
狀態(tài)的 Promise 會(huì)回調(diào)后面的第一個(gè) .catch
任何一個(gè) rejected
狀態(tài)切后面沒(méi)有 .catch
的 Promise 會(huì)造成 Js 環(huán)境的全局錯(cuò)誤
我們繼續(xù)之前面試的例子
function interview() { return new Promise(function (resolve, reject) { setTimeout(() => { if (Math.random() > 0.4) { // resolve, reject 只能接受一個(gè)參數(shù) resolve("success"); } else { reject(new Error("fail")); } }, 1000); }); } (function () { const res = interview(); res .then((result) => { console.log("面試成功!我笑了"); }) .catch((error) => { console.log("面試失??!我哭了"); }); })();
function interview() { return new Promise(function (resolve, reject) { setTimeout(() => { if (Math.random() > 0.4) { // resolve, reject 只能接受一個(gè)參數(shù) resolve("success"); } else { reject(new Error("fail")); } }, 500); }); } (function () { const promsie1 = interview(); const promsie2 = promsie1.then((result) => { throw new Error("面試成功!我笑了,但是我拒絕了"); }); setTimeout(() => { console.log("promsie1", promsie1); console.log("promsie2", promsie2); }, 800); })();
以上代碼可以看出 ,**.then
返回一個(gè)全新的 Promise, 此 Promise 的結(jié)果狀態(tài)是由 .then
的回調(diào)函數(shù)的結(jié)果來(lái)決定的
如果回調(diào)函數(shù)最終是throw
, 則進(jìn)入 rejected
如果回調(diào)函數(shù)最終是return
,則進(jìn)入 resolved
function interview() { return new Promise(function (resolve, reject) { setTimeout(() => { if (Math.random() > 0) { // resolve, reject 只能接受一個(gè)參數(shù) resolve("success"); } else { reject(new Error("fail")); } }, 500); }); } (function () { const promsie1 = interview(); const promsie2 = promsie1.catch((result) => { return "雖然面試失敗,但我還是笑了"; }); setTimeout(() => { console.log("promsie1", promsie1); console.log("promsie2", promsie2); }, 800); })();
.catch
返回一個(gè)全新的 Promise, 此 Promise 的結(jié)果狀態(tài)是由 .catch
的回調(diào)函數(shù)的結(jié)果來(lái)決定的
如果回調(diào)函數(shù)最終是throw
, 則進(jìn)入 rejected
如果回調(diào)函數(shù)最終是return
,則進(jìn)入 resolved
function interview() { return new Promise(function (resolve, reject) { setTimeout(() => { if (Math.random() > 0.4) { // resolve, reject 只能接受一個(gè)參數(shù) resolve("success"); } else { reject(new Error("fail")); } }, 500); }); } (function () { const promsie1 = interview(); const promsie2 = promsie1 .then((result) => { return new Promise(function (resolve, reject) { setTimeout(() => { resolve("面試成功!,給我400ms 總結(jié)一下"); }, 400); }); }) .catch((result) => { return new Promise(function (resolve, reject) { setTimeout(() => { resolve("面試失敗,給我400ms 總結(jié)一下"); }, 400); }); }); setTimeout(() => { console.log("800ms promsie1", promsie1); console.log("800ms promsie2", promsie2); }, 800); setTimeout(() => { console.log("1000ms promsie1", promsie1); console.log("1000ms promsie2", promsie2); }, 1000); })();
如果在 .catch
,.then
中 返回 Promise, 則會(huì)等待此 Promise 的執(zhí)行結(jié)果
如果回調(diào)函數(shù)最終 return 了 Promise,該 promise 和回調(diào)函數(shù)的 return 的 Promsie 狀態(tài)保持一致, 這就表示了可以 在 Promise 的鏈?zhǔn)秸{(diào)用里面串行的執(zhí)行多個(gè)異步任務(wù)!
// round 面試第幾輪 function interview(round) { return new Promise(function (resolve, reject) { setTimeout(() => { if (Math.random() > 0.4) { // resolve, reject 只能接受一個(gè)參數(shù) resolve("success"); } else { const error = new Error("fail"); reject({ round, error }); } }, 500); }); } (function () { interview(1) .then(() => { return interview(2); }) .then(() => { return interview(3); }) .then(() => { console.log("每輪面試都成功!我開(kāi)心的笑了"); }) .catch((err) => { console.log(`第${err.round}輪面試失敗了`); }); })();
Promise 的 .then .catch 把回調(diào)地獄變成了一段線性的代碼!
// round 面試第幾輪 function interview(name) { return new Promise(function (resolve, reject) { setTimeout(() => { if (Math.random() > 0.4) { // resolve, reject 只能接受一個(gè)參數(shù) resolve("success"); } else { const error = new Error("fail"); reject({ name, error }); } }, 500); }); } (function () { Promise.all([interview("tenxun"), interview("ali"), interview("baidu")]) .then(() => { console.log("每家公司都面試成功了"); }) .catch((err) => { console.log(`面試${err.name}失敗了`); }); })();
到此,關(guān)于“Nodejs異步編程中的Promise有什么作用”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!