欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Nodejs異步編程中的Promise有什么作用

這篇文章主要介紹“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

Promise 是一種異步編程的解決方案!

  • 當前事件循環(huán)得不到的結(jié)果,但未來的事件循環(huán)會給到你結(jié)果

  • 是一個狀態(tài)機

    • pengding

    • resolved

    • reejectd

從代碼看狀態(tài)流轉(zhuǎn)是怎樣的

pending 到 resolve 的流轉(zhuǎn)測試

(function () {
  const res = new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve();
    }, 500);
  });
  console.log("500ms", res);

  setTimeout(() => {
    console.log("800ms", res);
  }, 800);
})();

打印出如下內(nèi)容

Nodejs異步編程中的Promise有什么作用

結(jié)果是符合我們的預期的

  • 我們無法立即獲取promise的結(jié)果,此時promise處于pending狀態(tài)

  • 必須等待一段時間過后才能獲取promise的結(jié)果,此時promise處于fulfilled狀態(tài)

pending 到 reject 的流轉(zhuǎn)測試

(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)容

Nodejs異步編程中的Promise有什么作用

結(jié)果是符合我們的預期的

  • 我們無法立即獲取promise的結(jié)果,此時promise處于pending狀態(tài)

  • 必須等待一段時間過后才能獲取promise的結(jié)果,此時promise處于reject狀態(tài)

注意:如果當 pengding 狀態(tài)進入到 reject 狀態(tài),這個錯誤又沒有正確捕獲的話,這個錯誤就會被拋到 JS 的全局

reslove 狀態(tài)流轉(zhuǎn)到 reject 狀態(tài)測試

(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)容

Nodejs異步編程中的Promise有什么作用

可以發(fā)現(xiàn)!

在 300ms 的時候promise的狀態(tài)已經(jīng)切換到了resolve, 切換后永遠也無法到達reject狀態(tài)

  • pending 只能流轉(zhuǎn)到 resolve 或者 reject;

  • resolvereject 不能互相流轉(zhuǎn);

使用 then,catch 捕獲 promise 的結(jié)果

(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)容

Nodejs異步編程中的Promise有什么作用

可以發(fā)現(xiàn)

  • thenpromise 的狀態(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)容

Nodejs異步編程中的Promise有什么作用

可以發(fā)現(xiàn)

catchpromise 的狀態(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)境的全局錯誤

Promise 相比 callback 優(yōu)秀的地方

解決異步流程控制問題-回調(diào)地獄

我們繼續(xù)之前面試的例子

使用 Promise 改造 之前的 interview 函數(shù)
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("面試失??!我哭了");
    });
})();
.then 中拋出錯誤的情況測試
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);
})();

Nodejs異步編程中的Promise有什么作用

以上代碼可以看出 ,**.then返回一個全新的 Promise, 此 Promise 的結(jié)果狀態(tài)是由 .then 的回調(diào)函數(shù)的結(jié)果來決定的

  • 如果回調(diào)函數(shù)最終是throw, 則進入 rejected

  • 如果回調(diào)函數(shù)最終是return,則進入 resolved

.catch 中正常值的情況測試
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);
})();

Nodejs異步編程中的Promise有什么作用

.catch 返回一個全新的 Promise, 此 Promise 的結(jié)果狀態(tài)是由 .catch 的回調(diào)函數(shù)的結(jié)果來決定的

  • 如果回調(diào)函數(shù)最終是throw, 則進入 rejected

  • 如果回調(diào)函數(shù)最終是return,則進入 resolved

.catch,.then 里面再返回 Promise
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);
})();

Nodejs異步編程中的Promise有什么作用

如果在 .catch,.then 中 返回 Promise, 則會等待此 Promise 的執(zhí)行結(jié)果

如果回調(diào)函數(shù)最終 return 了 Promise,該 promise 和回調(diào)函數(shù)的 return 的 Promsie 狀態(tài)保持一致, 這就表示了可以 在 Promise 的鏈式調(diào)用里面串行的執(zhí)行多個異步任務!

Promise 實現(xiàn)多輪面試-串行

// 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)地獄變成了一段線性的代碼!

Promise 實現(xiàn)多加公司面試-并行

// 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)

網(wǎng)站托管運營
日本国产精品免费在线观看| 日本加勒比系列在线视频| 欧美日韩国产av一区| 日本不卡二区高清三区| 台湾三级一区二区三区| 欧美一级特黄大片免色| 国产精品中文字幕欧美日韩| 亚洲国产综合亚洲综合国产| 日韩精品电影一二三| 日本不卡一二区不久精品免费 | 日韩欧美午夜福利在线视频| 成年网站在线91九色| 亚洲一区二区三区 日韩精品| 日韩精品一区二区三区人妻视频 | av电影网站中文字幕| 亚洲国产成人午夜精品| 国产美女主播在线精品一区| 日本视频三区在线播放| 亚洲激情在线观看一区| 欧美大片免费在线播放| 麻豆看片高清在线播放| 人妻有码一区二区三区| 人妻熟女一区二区aⅴ在线视频| 国产一级黄色性生活片| 国产精品十八禁在线看| 青青草原在线视频一区| 精品欧美一区二区在线| 国产无套内射三级视频| 国内揄拍国内精品少妇国| 国产饥渴熟女在线三区| 久久精品国产av一一区| 九九九热这里只有精品| 精品一区二区三区亚洲| 色哟哟网站在线观看入口| 日本韩国精品视频在线| 久久最新视频中文字幕| 饥渴少妇高潮露脸嗷嗷叫| 国产又粗又猛又爽黄老大爷| 国产三级三级三级av精品| 日韩亚洲在线中文字幕| 亚洲日本韩国福利久久|