JavaScript中使用Promise.all()和Promise.allSettled()方法
本教學將教您如何在 JavaScript 中使用 Promise 等待。
在本教程中,我將教您有關 Promise.all()
和 Promise.allSettled()
方法以及如何使用它們來處理多個 Promise。
使用 Promise.all()
方法
Promise
物件有三個有用的方法,名稱為then()
、catch()
和finally()
,您可以使用它們在Promise 完成時執行回調方法。 p>
Promise.all()
方法是一個靜態方法,這意味著它屬於整個類,而不是綁定到該類別的任何特定實例。它接受可迭代的 Promise 作為輸入並傳回單一 Promise
物件。
正如我之前提到的,Promise.all()
方法傳回一個新的 Promise。如果傳遞給該方法的所有承諾都已成功解析,則此新承諾將解析為已確定承諾值的陣列。一旦通過的承諾之一被拒絕,這個新的承諾也將被拒絕。
所有 Promise 均成功解決
以下是 Promise.all()
方法的範例,其中所有 Promise 均已成功解析:
const promise_a = new Promise((resolve) => { setTimeout(() => { resolve('Loaded Textures'); }, 3000); }); const promise_b = new Promise((resolve) => { setTimeout(() => { resolve('Loaded Music'); }, 2000); }); const promise_c = new Promise((resolve) => { setTimeout(() => { resolve('Loaded Dialogues'); }, 4000); }); const promises = [ promise_a, promise_b, promise_c ]; console.log('Hello, Promises!'); Promise.all(promises).then((values) => { console.log(values); console.log('Start the Game!'); }); /* Output 19:32:06 Hello, Promises! 19:32:10 Array(3) [ "Loaded Textures", "Loaded Music", "Loaded Dialogues" ] 19:32:10 Start the Game! */
我們在呼叫 Promise.all()
方法之前的語句記錄於 19:32:06。此外,我們的第三個 Promise 名為 promise_c
需要最長的時間才能解決,並在 4 秒後解決。這意味著呼叫 all()
方法傳回的 Promise 也應該需要 4 秒鐘才能解析。我們可以透過將回呼函數傳遞給 then()
方法來驗證是否需要 4 秒鐘才能解析。
這裡需要注意的另一件重要事情是,傳回的已完成值陣列包含這些值的順序與我們將 Promise 傳遞給 Promise.all()
方法的順序相同。名為 promise_b
的 Promise 解析速度最快,只需 2 秒。但是,其解析值仍然位於傳回數組中的第二個位置。這與我們將 Promise 傳遞給 Promise.all()
方法的位置相符。
這種秩序的維護在某些情況下非常有幫助。例如,假設您正在使用十個不同的 Promise 來獲取有關十個不同城市的天氣資訊。所有這些問題不會同時解決,而且不可能事先知道它們的解決順序。但是,如果您知道資料按照傳遞 Promise 的順序返回,您將能夠正確分配它以供以後操作。
一個承諾被拒絕
以下是其中一個承諾被拒絕的範例:
const promise_a = new Promise((resolve) => { setTimeout(() => { resolve('Loaded Textures'); }, 3000); }); const promise_b = new Promise((resolve, reject) => { setTimeout(() => { reject(new Error('Could Not Load Music')); }, 2000); }); const promise_c = new Promise((resolve) => { setTimeout(() => { resolve('Loaded Dialogues'); }, 4000); }); const promises = [ promise_a, promise_b, promise_c ]; console.log('Hello, Promises!'); Promise.all(promises).catch((error) => { console.error(error.message); console.log('Stop the Game!'); }); /* Output 20:03:43 Hello, Promises! 20:03:45 Could Not Load Music 20:03:45 Stop the Game! */
同樣,我們在呼叫 all()
方法之前的語句記錄於 20:03:43。然而,我們的第二個承諾 promise_b
這次以拒絕告終。我們可以看到 promise_b
在 2 秒後被拒絕。這意味著 all()
方法傳回的 Promise 也應該在 2 秒後拒絕,並出現與我們的 promise_b
相同的錯誤。從輸出中可以明顯看出,這正是發生的情況。
與 await
關鍵字一起使用
您可能已經知道 await
關鍵字用於等待承諾解決,然後再繼續下一步。我們也知道 all()
方法傳回一個承諾。這意味著我們可以使用 await
以及對 Promise.all()
方法的呼叫。
唯一要記住的是,由於 await
僅在非同步函數和模組內有效,因此我們必須將程式碼包裝在非同步函數內,如下所示:
function create_promise(data, duration) { return new Promise((resolve) => { setTimeout(() => { resolve(data); }, duration); }); } const promise_a = create_promise("Loaded Textures", 3000); const promise_b = create_promise("Loaded Music", 2000); const promise_c = create_promise("Loaded Dialogue", 4000); const my_promises = [promise_a, promise_b, promise_c]; async function result_from_promises(promises) { let loading_status = await Promise.all(promises); console.log(loading_status); } result_from_promises(my_promises); /* Outputs 08:50:43 Hello, Promises! 08:50:47 Array(3) [ "Loaded Textures", "Loaded Music", "Loaded Dialogue" ] */
這次,我們定義了一個名為 create_promise()
的函數,它根據提供的資料和持續時間為我們建立承諾。我們的非同步 result_from_promises()
函數使用 await
關鍵字來等待 Promise 解析。
使用 Promise.allSettled()
方法
當您只想在所有承諾成功解決後繼續操作時,使用 Promise.all()
方法是有意義的。例如,當您載入遊戲資源時,這可能很有用。
但是,假設您正在獲取有關不同城市天氣的資訊。在這種情況下,您可以輸出獲取資料成功的所有城市的天氣訊息,並輸出獲取資料失敗的錯誤訊息。
Promise.allSettled()
方法在這種情況下效果最好。此方法等待所有通過的承諾通過決議或拒絕來解決。此方法傳回的 Promise 包含一個物件數組,其中包含有關每個 Promise 結果的資訊。
function create_promise(city) { let random_number = Math.random(); let duration = Math.floor(Math.random()*5)*1000; return new Promise((resolve, reject) => { if (random_number < 0.8) { setTimeout(() => { resolve(`Show weather in ${city}`); }, duration); } else { setTimeout(() => { reject(`Data unavailable for ${city}`); }, duration); } }); } const promise_a = create_promise("Delhi"); const promise_b = create_promise("London"); const promise_c = create_promise("Sydney"); const my_promises = [create_promise("Delhi"), create_promise("London"), create_promise("Sydney"), create_promise("Rome"), create_promise("Las Vegas")]; async function result_from_promises(promises) { let loading_status = await Promise.allSettled(promises); console.log(loading_status); } result_from_promises(my_promises); /* Outputs [ { "status": "fulfilled", "value": "Show weather in Delhi" }, { "status": "fulfilled", "value": "Show weather in London" }, { "status": "fulfilled", "value": "Show weather in Sydney" }, { "status": "rejected", "reason": "Data unavailable for Rome" }, { "status": "fulfilled", "value": "Show weather in Las Vegas" } ] */
如您所见,数组中的每个对象都包含一个 status
属性,让我们知道承诺是否已实现或被拒绝。在履行承诺的情况下,它包含 value
属性中的解析值。在被拒绝的 Promise 的情况下,它在 reason
属性中包含拒绝的原因。
最终想法
我们了解了 Promise
类的两个有用方法,它们可以让您同时处理多个 Promise。当您想要在其中一个 Promise 被拒绝后立即停止等待其他 Promise 解决时, Promise.all()
方法很有用。当您想要等待所有承诺解决时,无论其解决或拒绝状态如何, Promise.allSettled()
方法非常有用。
以上是JavaScript中使用Promise.all()和Promise.allSettled()方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

您想將博客從 WordPress.com 移至 WordPress.org 嗎? 許多初學者從 WordPress.com 開始,但很快意識到其局限性,並希望切換到自託管 WordPress.org 平台。 在本分步指南中,我們將向您展示如何正確地將博客從 WordPress.com 移動到 WordPress.org。 為什麼從 WordPress.com 遷移到 WordPress.org? WordPress.com 允許任何人通過創建帳戶來

您是否正在尋找自動化 WordPress 網站和社交媒體帳戶的方法? 通過自動化,您將能夠在 Facebook、Twitter、LinkedIn、Instagram 等平台上自動分享您的 WordPress 博客文章或更新。 在本文中,我們將向您展示如何使用 IFTTT、Zapier 和 Uncanny Automator 輕鬆實現 WordPress 和社交媒體的自動化。 為什麼要自動化 WordPress 和社交媒體? 自動化您的WordPre

就在幾天前,我們的一位用戶報告了一個不尋常的問題。問題是他達到了自定義菜單項的限制。達到菜單項限制後他保存的任何內容都將根本無法保存。我們從未聽說過這個問題,因此我們決定在本地安裝上嘗試一下。創建了 200 多個菜單項並保存。效果很好。將 100 個項目移至下拉列表中,保存效果非常好。那時我們就知道這與服務器有關。經過進一步研究,似乎還有許多其他人也遇到了同樣的問題。深入挖掘後,我們發現了一張 trac 票證 ( #14134 ) 強調了這個問題。在閱讀了非常

您需要將自定義元字段添加到 WordPress 中的自定義分類法嗎? 自定義分類法可讓您組織除類別和標籤之外的內容。有時添加其他字段來描述它們很有用。 在本文中,我們將向您展示如何將其他元字段添加到他們創建的分類法中。 何時應將自定義元字段添加到自定義分類法? 當您在WordPress 網站上創建新內容時,您可以使用兩種默認分類法(類別和標籤)對其進行組織。 一些網站受益於自定義分類法的使用。這些允許您以其他方式對內容進行排序。 例如,

Windows live writer 是一款多功能工具,可讓您直接從桌面將帖子發佈到 WordPress 博客上。這意味著您根本不需要登錄 WordPress 管理面板來更新您的博客。在本教程中,我將向您展示如何使用 Windows Live Writer 為您的 WordPress 博客啟用桌面發布。 如何在 WordPress 上設置 Windows Live Writer 第 1 步: 要通過 Windows Live Writer 在 WordPr

最近,我們的一位用戶報告了一個非常奇怪的安裝問題。寫帖子時,他們看不到自己寫的任何內容。因為帖子編輯器的文字是白色的。更重要的是,所有可視化編輯器按鈕都丟失了,並且從可視化切換到 HTML 的功能也不起作用。在本文中,我們將向您展示如何修復 WordPress 可視化編輯器中的白色文本和缺失按鈕問題。 初學者註意事項:如果您正在尋找可能在其他網站的屏幕截圖中看到的隱藏按鈕,那麼您可能正在尋找廚房水槽。您必須單擊廚房水槽圖標才能看到其他選項,例如下劃線、從單詞複製等。

您想在 WordPress 中顯示用戶電子郵件中的頭像嗎? Gravatar 是一項將用戶的電子郵件地址連接到在線頭像的網絡服務。 WordPress 會自動在評論部分顯示訪問者的頭像,但您可能也想將它們添加到網站的其他區域。 在本文中,我們將向您展示如何在 WordPress 中顯示用戶電子郵件中的頭像。 什麼是 Gravatar 以及為什麼要顯示它? Gravatar代表全球認可的頭像,它允許人們將圖片鏈接到他們的電子郵件地址。 如果網站支

您想更改 WordPress 中的默認媒體上傳位置嗎? 將媒體文件移動到其他文件夾可以提高網站的速度和性能,並幫助您更快地創建備份。它還使您可以自由地以最適合您的方式組織文件。 在本文中,我們將向您展示如何更改 WordPress 中的默認媒體上傳位置。 為什麼要更改默認媒體上傳位置? 默認情況下,WordPress 將所有圖像和其他媒體文件存儲在 /wp-content/uploads/ 文件夾中。 在此文件夾中,您將找到不同年份和月份的子


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

Dreamweaver Mac版
視覺化網頁開發工具

禪工作室 13.0.1
強大的PHP整合開發環境

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能