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

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一区二区三区色多多| 亚洲精品尤物福利在线一区| 农村精品少妇久久久久久| 黑人巨大精品欧美黑寡妇| 日本高清一区二区网站| 日本一区二区免费视频| 日韩精品成人一区二区三区免费| 免费精品黑人一区二区三区| 欧美三级精品三级在线| 中出亚洲精品日韩在线视频| 国产欧美日韩另类视频| 国产欧美激情一区二区| 亚洲男女内射在线视频| 欧美高清视频免费播放| 国产一区在线免费在线观看| 国产亚洲精品视频热| 国产激情av网站在线观看| 懂色av中文一区二区| 欧美午夜精品福利在线观看| 国产精品盗摄一区二区三区| 四虎精品免费在线视频| 亚洲av第一区国产精品| 亚洲av乱码专区国产乱码| 一区二区精品福利视频| 三级国产大片在线观看| 蜜臀av在线国产一区| 一二区中文字幕在线观看| 香港精品国产三级国产av | 要爽死国产一区在线播放| 国产激情视频一区二区三区| 国产精品极品网站91青青| 日韩在线视频一区二区三| 日本午夜激情一区二区| 亚洲av乱码毛片在线播放| 成人性生交大片免费看中文| 欧美久久久久久久黑人| 欧美久久精品在线观看| 亚洲国产日韩精品一区二|