這篇文章主要介紹“Nodejs異步編程中的Promise有什么作用”,在日常操作中,相信很多人在Nodejs異步編程中的Promise有什么作用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Nodejs異步編程中的Promise有什么作用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
在柞水等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務理念,為客戶提供網(wǎng)站設計、成都網(wǎng)站制作 網(wǎng)站設計制作按需求定制制作,公司網(wǎng)站建設,企業(yè)網(wǎng)站建設,成都品牌網(wǎng)站建設,網(wǎng)絡營銷推廣,外貿(mào)網(wǎng)站制作,柞水網(wǎng)站建設費用合理。
Promise 是一種異步編程的解決方案!
當前事件循環(huán)得不到的結(jié)果,但未來的事件循環(huán)會給到你結(jié)果
是一個狀態(tài)機
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é)果是符合我們的預期的
我們無法立即獲取promise
的結(jié)果,此時promise
處于pending
狀態(tài)
必須等待一段時間過后才能獲取promise
的結(jié)果,此時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é)果是符合我們的預期的
我們無法立即獲取promise
的結(jié)果,此時promise
處于pending
狀態(tài)
必須等待一段時間過后才能獲取promise
的結(jié)果,此時promise
處于reject
狀態(tài)
注意:如果當
pengding
狀態(tài)進入到reject
狀態(tài),這個錯誤又沒有正確捕獲的話,這個錯誤就會被拋到 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 的時候promise
的狀態(tài)已經(jīng)切換到了resolve
, 切換后永遠也無法到達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 錯誤已經(jīng)可以被 catch
捕獲到了
.then .catch 總結(jié)
resolved
狀態(tài)的 Promise 會回調(diào)后面的第一個 .then
rejected
狀態(tài)的 Promise 會回調(diào)后面的第一個 .catch
任何一個 rejected
狀態(tài)切后面沒有 .catch
的 Promise 會造成 Js 環(huán)境的全局錯誤
我們繼續(xù)之前面試的例子
function interview() { return new Promise(function (resolve, reject) { setTimeout(() => { if (Math.random() > 0.4) { // resolve, reject 只能接受一個參數(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 只能接受一個參數(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
返回一個全新的 Promise, 此 Promise 的結(jié)果狀態(tài)是由 .then
的回調(diào)函數(shù)的結(jié)果來決定的
如果回調(diào)函數(shù)最終是throw
, 則進入 rejected
如果回調(diào)函數(shù)最終是return
,則進入 resolved
function interview() { return new Promise(function (resolve, reject) { setTimeout(() => { if (Math.random() > 0) { // resolve, reject 只能接受一個參數(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
返回一個全新的 Promise, 此 Promise 的結(jié)果狀態(tài)是由 .catch
的回調(diào)函數(shù)的結(jié)果來決定的
如果回調(diào)函數(shù)最終是throw
, 則進入 rejected
如果回調(diào)函數(shù)最終是return
,則進入 resolved
function interview() { return new Promise(function (resolve, reject) { setTimeout(() => { if (Math.random() > 0.4) { // resolve, reject 只能接受一個參數(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, 則會等待此 Promise 的執(zhí)行結(jié)果
如果回調(diào)函數(shù)最終 return 了 Promise,該 promise 和回調(diào)函數(shù)的 return 的 Promsie 狀態(tài)保持一致, 這就表示了可以 在 Promise 的鏈式調(diào)用里面串行的執(zhí)行多個異步任務!
// round 面試第幾輪 function interview(round) { return new Promise(function (resolve, reject) { setTimeout(() => { if (Math.random() > 0.4) { // resolve, reject 只能接受一個參數(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("每輪面試都成功!我開心的笑了"); }) .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 只能接受一個參數(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}失敗了`); }); })();
到此,關于“Nodejs異步編程中的Promise有什么作用”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
新聞名稱:Nodejs異步編程中的Promise有什么作用
轉(zhuǎn)載注明:http://aaarwkj.com/article38/gooepp.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)、手機網(wǎng)站建設、網(wǎng)站設計、面包屑導航、ChatGPT、企業(yè)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)