真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

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

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

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

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

  • 是一個(gè)狀態(tài)機(jī)

    • pengding

    • resolved

    • reejectd

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

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

(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é)果是符合我們的預(yù)期的

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

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

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

(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é)果是符合我們的預(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 的全局

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

(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 的時(shí)候promise的狀態(tài)已經(jīng)切換到了resolve, 切換后永遠(yuǎn)也無(wú)法到達(dá)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 錯(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ò)誤

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

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

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

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

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

以上代碼可以看出 ,**.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

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

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

.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

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

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

如果在 .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ù)!

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

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

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

// 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í)用的文章!


當(dāng)前文章:Nodejs異步編程中的Promise有什么作用
文章分享:http://weahome.cn/article/gooepp.html

其他資訊

在線咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部