中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2021-07-07 17:16:30 來源:億速云 閱讀:165 作者:chen 欄目:web開發

這篇文章主要介紹“Nodejs異步編程中的Promise有什么作用”,在日常操作中,相信很多人在Nodejs異步編程中的Promise有什么作用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Nodejs異步編程中的Promise有什么作用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

什么是 Promise

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

  • 當前事件循環得不到的結果,但未來的事件循環會給到你結果

  • 是一個狀態機

    • pengding

    • resolved

    • reejectd

從代碼看狀態流轉是怎樣的

pending 到 resolve 的流轉測試

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

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

打印出如下內容

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

結果是符合我們的預期的

  • 我們無法立即獲取promise的結果,此時promise處于pending狀態

  • 必須等待一段時間過后才能獲取promise的結果,此時promise處于fulfilled狀態

pending 到 reject 的流轉測試

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

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

打印出如下內容

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

結果是符合我們的預期的

  • 我們無法立即獲取promise的結果,此時promise處于pending狀態

  • 必須等待一段時間過后才能獲取promise的結果,此時promise處于reject狀態

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

reslove 狀態流轉到 reject 狀態測試

(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);
})();

打印出如下內容

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

可以發現!

在 300ms 的時候promise的狀態已經切換到了resolve, 切換后永遠也無法到達reject狀態

  • pending 只能流轉到 resolve 或者 reject;

  • resolvereject 不能互相流轉;

使用 then,catch 捕獲 promise 的結果

(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);
})();

打印出如下內容

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

可以發現

  • thenpromise 的狀態流轉到 reslove 狀態可以拿到的結果

(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);
})();

打印出如下內容

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

可以發現

catchpromise 的狀態流轉到 reject 狀態可以拿到的結果, 并且之前全局的 JS 錯誤已經可以被 catch 捕獲到了

.then .catch 總結

  • resolved 狀態的 Promise 會回調后面的第一個 .then

  • rejected 狀態的 Promise 會回調后面的第一個 .catch

  • 任何一個 rejected 狀態切后面沒有 .catch 的 Promise 會造成 Js 環境的全局錯誤

Promise 相比 callback 優秀的地方

解決異步流程控制問題-回調地獄

我們繼續之前面試的例子

使用 Promise 改造 之前的 interview 函數
function interview() {
  return new Promise(function (resolve, reject) {
    setTimeout(() => {
      if (Math.random() > 0.4) {
        // resolve, reject 只能接受一個參數
        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 只能接受一個參數
        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 的結果狀態是由 .then 的回調函數的結果來決定的

  • 如果回調函數最終是throw, 則進入 rejected

  • 如果回調函數最終是return,則進入 resolved

.catch 中正常值的情況測試
function interview() {
  return new Promise(function (resolve, reject) {
    setTimeout(() => {
      if (Math.random() > 0) {
        // resolve, reject 只能接受一個參數
        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 的結果狀態是由 .catch 的回調函數的結果來決定的

  • 如果回調函數最終是throw, 則進入 rejected

  • 如果回調函數最終是return,則進入 resolved

.catch,.then 里面再返回 Promise
function interview() {
  return new Promise(function (resolve, reject) {
    setTimeout(() => {
      if (Math.random() > 0.4) {
        // resolve, reject 只能接受一個參數
        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 總結一下");
        }, 400);
      });
    })
    .catch((result) => {
      return new Promise(function (resolve, reject) {
        setTimeout(() => {
          resolve("面試失敗,給我400ms 總結一下");
        }, 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 的執行結果

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

Promise 實現多輪面試-串行

// round 面試第幾輪
function interview(round) {
  return new Promise(function (resolve, reject) {
    setTimeout(() => {
      if (Math.random() > 0.4) {
        // resolve, reject 只能接受一個參數
        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 把回調地獄變成了一段線性的代碼!

Promise 實現多加公司面試-并行

// round 面試第幾輪
function interview(name) {
  return new Promise(function (resolve, reject) {
    setTimeout(() => {
      if (Math.random() > 0.4) {
        // resolve, reject 只能接受一個參數
        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有什么作用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

东莞市| 抚顺县| 龙里县| 类乌齐县| 多伦县| 广丰县| 三台县| 子洲县| 民勤县| 开远市| 潮安县| 平度市| 中西区| 绵阳市| 桐城市| 秦安县| 枣庄市| 波密县| 无棣县| 阿图什市| 清远市| 松阳县| 麟游县| 伊金霍洛旗| 龙南县| 二连浩特市| 沅陵县| 民乐县| 乡宁县| 抚州市| 临桂县| 蒲城县| 盐池县| 大方县| 天柱县| 贵州省| 白河县| 河池市| 正定县| 定边县| 佛教|