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

溫馨提示×

溫馨提示×

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

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

JavaScript中的Promise是什么

發布時間:2022-02-23 11:30:37 來源:億速云 閱讀:151 作者:小新 欄目:開發技術

這篇文章將為大家詳細講解有關JavaScript中的Promise是什么,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

JavaScript 中的 Promise 是什么?

想象一下,您正在為您公司的某個職位面試求職者。

一個年輕人瘋狂地進來接受采訪。當他的面試即將開始時,他意識到自己忘記了簡歷。

無賴,對吧?

不過,他并不氣餒。幸運的是,他有一個當時還在家里的室友。

他迅速通過電話給他的室友打電話,向他尋求幫助。他懇求他的室友幫忙找他的簡歷。他的室友答應他一有事情要報告就回短信。

假設最終找到了簡歷,他可以回短信:

“成功了,我找到了你的簡歷!”

但如果他沒有找到,他應該發回一條失敗信息,說明他找不到簡歷的原因。例如,他可能會將此消息發送給正在面試的朋友:

“抱歉,我找不到你的簡歷,因為你保險箱的鑰匙不見了。”

與此同時,面試按計劃繼續進行,面試官堅持找到簡歷的promise,而不是實際的簡歷。此時,面試官將投遞簡歷的狀態設置為 PENDING。

受訪者回答了他被問到的所有問題。但歸根結底,他的就業仍然取決于他簡歷的最終狀態。

他的室友終于回了短信。正如我們之前討論過的,如果他沒有找到簡歷,他會與您分享這次失敗以及他沒有找到的原因。

當這種情況發生時,面試將結束,面試者將被拒絕。

另一方面,如果室友找到了簡歷,他會很高興地告訴他的朋友他成功了,他會繼續前進,實現他找到工作的希望。

那么這如何轉換為 JS 代碼呢?

promise找到簡歷并發短信的室友與我們如何在 JavaScript 中定義promise是同義詞。代碼不會直接或立即返回值。相反,它返回一個promise,它最終將在以后提供該值。

JavaScript 中的 promise 是異步的,這意味著它需要時間來解決或完成。正如搜索申請人的簡歷需要時間來完成一樣。

出于這個原因,面試官決定不坐下來無所事事,所以他們根據投遞簡歷的承諾開始面試候選人。我們正在使用返回簡歷代替實際簡歷的promise。

JS 引擎也不會等待什么都不做——它開始執行代碼的其他部分,等待 promise 的返回值。

消息文本包含簡歷搜索的狀態消息。對于 JavaScript Promise,這也稱為返回值。

如果消息是“成功”,我們將繼續簽署候選人并授予他職位。如果失敗,我們將繼續拒絕他的申請。

對于 JavaScript 承諾,我們通過使用回調函數(promise處理程序)來做到這一點。這些函數在嵌套then()方法中定義。

要指定要調用的回調,請使用以下兩個函數:

  • resolve(value):這表示異步任務成功。這將調用then()處理程序中的履行回調。

  • reject(error):這表示嘗試運行異步任務時出錯。這將在then()處理程序中調用拒絕回調。

如果promise成功,將調用履行回調。如果promise被拒絕,則將調用被拒絕的回調。

promise只是一個尚未完成的異步任務的占位符。當您在腳本中定義一個 promise 對象時,它不會立即返回一個值,而是返回一個 promise。

如何在 JavaScript 中編寫 Promise

您可以通過調用Promise該類并構造這樣的對象在 JavaScript 中定義promise:

const myPromise = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('this is the eventual value the promise will return');
  }, 300);
});

console.log(myPromise);

在控制臺中運行它會返回一個Promise對象:
JavaScript中的Promise是什么

不過,構造一個對象并不是定義 Promise 的唯一方法。您還可以使用內置PromiseAPI 來實現相同的功能:

const anotherPromise = Promise.resolve("this is the eventual value the promise will return")

console.log(anotherPromise);

雖然第一個代碼示例中的 Promise 會等待 3 秒,然后才使用this is the eventual...消息實現 Promise,但第二個代碼示例中的 Promise 將立即使用相同的消息實現它。

JavaScript 中的拒絕promise

Promise 也可以被拒絕。大多數情況下,拒絕發生是因為 JS 在運行異步代碼時遇到某種錯誤。在這種情況下,它會調用該reject()函數。

這是一個簡單而人為的例子,說明了 Promise 是如何被拒絕的:

const myPromise = new Promise((resolve, reject) => {
  let a = false;
  setTimeout(() => {
    return (a) ? resolve('a is found!'): reject('sorry, no a');
  }, 300);
});

你能想出這個promise被拒絕的原因嗎?如果你說“因為a不是假的”,恭喜!

第三個代碼示例中的 promise 將在三秒超時后解析為拒絕,因為該(a)?語句解析為 false,這將觸發reject.

如何訪問 then()中的先前的Promise結果

當 Promise 最終返回一個值時,您通常希望對該返回值執行一些操作。

例如,如果您正在發出網絡請求,您可能希望訪問該值并將其顯示在用戶的頁面上。

您可以定義兩個回調函數,當promise被實現或被拒絕時,您希望調用它們。這些函數在嵌套then()方法中定義:

const anotherPromise = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('this is the eventual value the promise will return');
  }, 300);
});

// CONTINUATION
anotherPromise
.then(value => { console.log(value) })

運行此代碼將在三秒鐘后在控制臺中顯示完成消息:

JavaScript中的Promise是什么

請注意,您可以根據需要嵌套任意數量的 promise。每一步都會在上一步之后執行,取上一步的返回值:

const anotherPromise = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('this is the eventual value the promise will return');
  }, 300);
});

anotherPromise
.then(fulfillFn, rejectFn)
.then(fulfilFn, rejectFn)
.then(value => { console.log(value) })

但是我們錯過了一些重要的事情。

始終牢記一個then()方法必須同時接受執行處理程序和拒絕處理程序。這樣,如果 Promise 得到滿足,則調用第一個,如果 Promise 因錯誤而被拒絕,則調用第二個。

代碼示例 4 和 5 中的 promise 不包含第二個處理程序。因此,假設遇到錯誤,將沒有拒絕處理程序來處理錯誤。

如果您只想在 中定義一個回調函數(又名完成處理程序)then(),那么您將需要catch()在 Promise 鏈的底部嵌套一個方法來捕獲任何可能的錯誤。

如何在JS中使用catch()方法

catch()每當在承諾鏈中的任何一點遇到錯誤時,都會調用該方法:

const myPromise = new Promise((resolve, reject) => {
  let a = false;
  setTimeout(() => {
    return (a) ? resolve('a is found!'): reject('sorry, no a');
  }, 300);
}); 

myPromise
.then(value => { console.log(value) })
.catch(err => { console.log(err) });

由于myPromise最終會解析為拒絕,因此嵌套中定義的函數then()將被忽略。相反,錯誤處理程序catch()將運行,它應該將以下錯誤消息記錄到控制臺:

JavaScript中的Promise是什么

關于“JavaScript中的Promise是什么”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

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

AI

寿阳县| 敦煌市| 宣武区| 广西| 江川县| 阿拉善盟| 廊坊市| 安顺市| 乐昌市| 清流县| 平泉县| 凭祥市| 徐州市| 喀什市| 鄂托克前旗| 自贡市| 河西区| 微山县| 迭部县| 怀柔区| 黄浦区| 古丈县| 德昌县| 柳林县| 淳安县| 沂南县| 铜陵市| 丽水市| 天台县| 达拉特旗| 五常市| 翁牛特旗| 乌鲁木齐县| 凤阳县| 鄂托克前旗| 康保县| 兴仁县| 凌源市| 罗江县| 厦门市| 安塞县|