如何在JavaScript中返回異步函數的結果

找出如何返回異步函數(使用Promise或回調函數)的結果,使用JavaScript。 假設你遇到了這個問題:你需要進行一個異步調用,並且需要將該調用的結果從原始函數中返回。 像這樣: const mainFunction = () => { const result = asynchronousFunction() return result } 但是asynchronousFunction()在內部執行了一些異步調用(例如fetch()調用),並且無法直接返回結果。該函數可能內部有一個需要等待的Promise,或者使用了回調函數。像這樣: const asynchronousFunction = () => { return fetch('./file.json').then(response => { return response }) } 那麼該怎麼辦呢? 使用async/await是最直接的解決方案。您可以使用await關鍵字代替基於Promise的方法,像我們之前使用的方法一樣: const asynchronousFunction = async () => { const response = await fetch('./file.json') return response } 在這種情況下,在mainFunction中,我們需要在函數簽名前加上async,並在調用asynchronousFunction()之前加上await: const mainFunction = async () => { const result = await asynchronousFunction() return result } 現在,因為它是一個async函數,它會返回一個Promise: mainFunction() // 返回一個Promise 為了獲取結果,您可以將其封裝在IIFE中,就像這樣: (async () => { console....

如何在JavaScript中驗證電子郵件地址

有很多方法可以驗證電子郵件地址。學習正確的方法,並了解使用純JavaScript的所有選項。 在處理表單時,驗證電子郵件地址是常見的操作之一。 在聯繫表單、註冊和登錄表單等方面非常有用。 有些人認為根本不應該對電子郵件進行驗證。我認為少量的驗證,不要過度追求完美,是更好的選擇。 電子郵件驗證應遵循哪些規則? 電子郵件地址由兩部分組成:本地部分和域名部分。 本地部分可以包含 任何字母或數字字符:a-zA-Z0-9 標點符號:"(),:;<>@[\] 特殊字符:!#$%&'*+-/=?^_``{|}~ 點號.,如果它不是第一個或最後一個字符。而且不能重複出現。 域名部分可以包含 任何字母或數字字符:a-zA-Z0-9 橫槓-,如果它不是第一個或最後一個字符。可以重複出現。 使用正則表達式 驗證電子郵件地址的最佳選擇是使用正則表達式。 沒有一個通用的電子郵件驗證正則表達式。大家似乎都在使用不同的驗證方法,而大多數在線找到的正則表達式將無法通過最基本的電子郵件場景驗證,原因可能是不準確,或者並沒有計算新引入的域名或國際化電子郵件地址。 不要盲目使用任何正則表達式,請先檢查一下。 我在Glitch上建立了這個例子,它將檢查一個被認為有效的電子郵件地址列表是否通過正則表達式驗證。您可以更改正則表達式並將其與您想使用的其他正則表達式進行比較。 當前添加的正則表達式是我認為最準確的,稍微經過修正以解決多個點的問題。 注意:這不是我想出來的。我在一個Quora答案中找到它,但我不確定它是否是原始來源。 這是一個使用該正則表達式進行驗證的函數: const validate = (email) => { const expression = /(?!.\*\.{2})^([a-z\d!#$%&'\*+\-\/=?^\_`{|}~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+(\.[a-z\d!#$%&'\*+\-\/=?^\_`{|}~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+)\*|"((([ \t]\*\r\n)?[ \t]+)?([\x01-\x08\x0b\x0c\x0e-\x1f\x7f\x21\x23-\x5b\x5d-\x7e\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]|\\[\x01-\x09\x0b\x0c\x0d-\x7f\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))\*(([ \t]\*\r\n)?[ \t]+)?")@(([a-z\d\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]|[a-z\d\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF][a-z\d\-.\_~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]\*[a-z\d\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])\.)+([a-z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]|[a-z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF][a-z\d\-.\_~\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]\*[a-z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])\.?$/i; return expression.test(String(email).toLowerCase()); }; 這滿足了所有常見情況,可以假設99.9%的用戶添加的電子郵件地址都可以成功驗證。 此Glitch上的代碼包含其他可以通過重新發布該項目輕松嘗試的正則表達式。 儘管相當準確,但這個正則表達式在一些邊界情況下存在一些問題,根據您的需求,您可以忽略這些問題。 對於奇怪的地址存在假陰性,例如 "very.(),:;<>[]".VERY."very@\ "very".unusual"@strange.example.com one."more\ long"@example.website.place 對於本機地址存在假陰性,例如 [[email protected]](/cdn-cgi/l/email-protection) [[email protected]](/cdn-cgi/l/email-protection) 在公開訪問的網站上幾乎沒有用處(對於在公開訪問的網站上禁用這些地址實際上是一個優勢) 同樣,在基於IP的電子郵件上有假陽性 user@[2001: DB8 :: 1] [[email protected]](/cdn-cgi/l/email-protection) 對於本地部分過長的地址存在假陽性 12345678901234[[email protected]](/cdn-cgi/l/email-protection) 您需要一個更簡單的正則表達式嗎? 上面的正則表達式非常複雜,以至於我甚至不嘗試去理解它。正規表達式大師們創建了它,並且在互聯網上流傳開來,直到我找到它為止。 在這一點上,使用它只是一個複製/粘貼的問題。 一個更簡單的解決方案只是檢查輸入的地址是否包含某個內容,然後是 @ 符號,然後是其他內容。 在這種情況下,使用以下正則表達式即可:...

如何在JavaScript函式中接受無限參數

如何實現一個接受無限參數的函式呢? 假設我們有一個名為 join() 的函式,它的任務是將我們傳遞給它的所有字符串串接起來。 例如,我們撰寫一個接受兩個字符串的原型: const join = (string1, string2) => { return string1 + string2 } 當我們調用它時,我們得到一個由我們傳遞的兩個參數串接而成的字符串: join('hi', ' flavio') // 'hi flavio' 一個簡單的方法是添加其他默認值為空字符串的參數,像這樣: const join = (string1, string2, string3 = '') => { return string1 + string2 + string3 } 但這種方法並不適用於大量參數,並且會讓我們的代碼看起來很糟糕。 相反,我們可以使用展開運算符 (...) 後跟我們想要使用的參數名稱的語法。在函式內部,該參數是一個陣列,所以我們可以簡單地調用它的 .join() 方法來串接它包含的字符串,並傳遞一個空字符串作為參數(否則默認會在字符串之間加上逗號): const join = (...strings) => { return strings.join('') } 在我們的例子中,我們還可以使用箭頭函式中提供的隱式返回語法進一步簡化: const join = (...strings) => strings.join('') 我們可以像之前一樣調用它: join('hi', ' flavio') // 'hi flavio' join('hi', ' flavio', ' it', ' is', ' a', ' beautiful day!...

如何在JavaScript数组中打乱元素

簡短回答: let list = [1, 2, 3, 4, 5, 6, 7, 8, 9] list = list.sort(() => Math.random() - 0.5) 詳細回答: 我有一個需要將JavaScript數組中的元素打亂的需求。 換句話說,我想將數組元素重新排列,使其與之前的順序不同。 從這樣一個數組開始: [1, 2, 3, 4, 5, 6, 7, 8, 9] 我希望每次運行操作時都得到不同的結果,像這樣: [4, 8, 2, 9, 1, 3, 6, 5, 7] [5, 1, 2, 3, 7, 4, 9, 6, 8] [3, 1, 4, 7, 8, 6, 2, 9, 5] 下面是我想出的過程。給定數組list: const list = [1, 2, 3, 4, 5, 6, 7, 8, 9] 我們可以調用sort()方法,該方法接受一個返回值在-0....

如何在JavaScript的for-of循環中獲得迭代的索引值

在ES6中引入的for-of循環是遍歷數組的一個很好方法: for (const v of ['a', 'b', 'c']) { console.log(v) } 你如何獲取迭代的索引值? 這個循環沒有提供任何語法來實現這一點,但是你可以結合在ES6中引入的解構語法與調用數組的entries()方法來實現: for (const [i, v] of ['a', 'b', 'c'].entries()) { console.log(i, v) }

如何在JS中將數組分成多個相等部分

我遇到了一個問題。 一個數組包含了很多項目,我想將它分成多個部分。 我想出了兩種完全不同的解決方案。 A)第一種是將數組平均分成多個部分,例如每個部分有2或3個項目 B)第二種是創建n個部分並為其添加相等的變量集合項目 不同的是我們分割的方法和原因。解決方案(A)在你不知道最後會得到多少組時很好用,而且你並不關心,但你知道你想要每個新數組中有X個項目。 解決方案(B)在你知道你想要創建多少組並且對此要求嚴格時很好用,但你並不關心每個新數組的項目數量。 換句話說,對於一個數組 [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 使用方案(A),我們可以創建2個項目的部分,得到 [ 1, 2 ] [ 3, 4 ] [ 5, 6 ] [ 7, 8 ] [ 9, 10 ] 或者3個項目的部分: [ 1, 2, 3 ] [ 4, 5, 6 ] [ 7, 8, 9 ] [ 10 ] 使用方案(B),我們可以將數組分成2個部分,得到: [ 1, 2, 3, 4, 5 ] [ 6, 7, 8, 9, 10 ] 或者分成3個部分,得到:...

如何在Node中獲取文件夾中所有文件的名稱

這裡將介紹如何使用Node.js列出文件系統中文件/文件夾中的所有文件: const fs = require('fs') const dir = '/Users/flavio/folder' const files = fs.readdirSync(dir) for (const file of files) { console.log(file) } 一旦獲得文件參考,可以使用以下方法獲取其詳細信息: const path = require('path') //... //在“for”循環內部 const stat = fs.lstatSync(path.join(dir, file)) 這對於區分文件和文件夾很有用,例如使用stat.isDirectory()方法。 fs和path是內置模塊,無需使用npm進行安裝

如何在純 JavaScript 中等待 DOM 準備就緒的事件

如何在盡可能早的時間點運行 JavaScript,而不是更早地運行? 您可以通過對 document 對象添加 DOMContentLoaded 事件的監聽器來實現: document.addEventListener('DOMContentLoaded', (event) => { // 事件發生時執行的代碼 }) 我通常不在事件回調中使用箭頭函數,因為無法訪問 this。 但在這種情況下,我們不需要 this,因為它始終是 document。在任何其他事件監聽器中,我都會使用常規函數: document.addEventListener('DOMContentLoaded', function(event) { // 事件發生時執行的代碼 }) 例如,如果我在一個循環中添加事件監聽器,且不確定事件觸發時 this 將會是什麼。

如何將 JavaScript 中的數組轉換為字符串

在 JavaScript 中將數組轉換為字符串的方法。 您可以使用數組的 toString() 方法來獲取數組的字符串表示: const list = [1, 2, 3, 4] list.toString() 例子: 數組的 join() 方法返回數組元素的連接字符串: const list = [1, 2, 3, 4] list.join() 您可以傳遞參數給這個方法,以添加自定義的分隔符: list.join(', ') 例子:

如何將內部物件的屬性複製到外部

問題:我有一個包含實際推文數據的 tweet 物件,由於應用程式的架構原因,這個數據被賦值給其 data 屬性中的另一個物件。 想像一下: let tweet = { data: { id: 1, content: 'test' } } 我想要將那些內部屬性移至頂層物件: let tweet = { id: 1, content: 'test' } 而不需要手動複製這些屬性,因為一旦我新增另一個屬性,就會引入一個錯誤。 以下是我的解決方法: tweet = Object.assign(tweet, tweet.data) 這是一種將屬性複製到另一個物件的技巧,但以稍微不同的方式應用。