{"id":296,"date":"2026-03-19T22:33:35","date_gmt":"2026-03-19T14:33:35","guid":{"rendered":"https:\/\/www.resilence.cn\/?p=296"},"modified":"2026-03-19T22:33:35","modified_gmt":"2026-03-19T14:33:35","slug":"day-26-%e5%bc%82%e6%ad%a5%e7%bc%96%e7%a8%8basync-await","status":"publish","type":"post","link":"https:\/\/www.resilence.cn\/?p=296","title":{"rendered":"Day-26-\u5f02\u6b65\u7f16\u7a0basync-await"},"content":{"rendered":"<h1>Day 26: \u5f02\u6b65\u7f16\u7a0basync\/await<\/h1>\n<blockquote>\n<p>\ud83d\udcc5 \u65e5\u671f: 2026\u5e7403\u670818\u65e5<br \/>\n\ud83c\udfaf \u5b66\u4e60\u76ee\u6807: \u6df1\u5165\u7406\u89e3 async\/await\uff0c\u638c\u63e1\u5f02\u6b65\u4ee3\u7801\u7684\u540c\u6b65\u5199\u6cd5<br \/>\n\u23f1\ufe0f \u9884\u8ba1\u7528\u65f6: 2-3 \u5c0f\u65f6<br \/>\n\ud83d\udcc2 \u5206\u7c7b: 10-\u73b0\u4ee3JavaScript<\/p>\n<\/blockquote>\n<hr>\n<h2>\ud83c\udfaf \u5b66\u4e60\u76ee\u6807<\/h2>\n<p>\u901a\u8fc7\u4eca\u5929\u7684\u5b66\u4e60\uff0c\u4f60\u5c06\uff1a<\/p>\n<ol>\n<li><strong>\u7406\u89e3 async\/await \u8bed\u6cd5<\/strong>\uff1a\u8ba9\u5f02\u6b65\u4ee3\u7801\u770b\u8d77\u6765\u50cf\u540c\u6b65\u4ee3\u7801<\/li>\n<li><strong>\u638c\u63e1\u9519\u8bef\u5904\u7406<\/strong>\uff1atry\/catch\u3001\u5f02\u5e38\u4f20\u64ad<\/li>\n<li><strong>\u5b66\u4f1a\u5e76\u884c\u5904\u7406<\/strong>\uff1aPromise.all + async\/await<\/li>\n<li><strong>\u5b9e\u8df5\u6700\u4f73\u5b9e\u8df5<\/strong>\uff1a\u907f\u514d\u5e38\u89c1\u9677\u9631\u3001\u6027\u80fd\u4f18\u5316<\/li>\n<li><strong>\u5e94\u7528\u5b9e\u6218\u573a\u666f<\/strong>\uff1aAPI \u8bf7\u6c42\u3001\u6587\u4ef6\u64cd\u4f5c\u3001\u6570\u636e\u5e93\u67e5\u8be2<\/li>\n<\/ol>\n<hr>\n<h2>\ud83d\udca1 \u6838\u5fc3\u6982\u5ff5<\/h2>\n<h3>1. async \u51fd\u6570\u5b9a\u4e49<\/h3>\n<pre><code class=\"language-javascript\">\/\/ async \u51fd\u6570\u603b\u662f\u8fd4\u56de Promise\nasync function fetchUserData(userId) {\n    const response = await fetch('\/api\/users\/' + userId);\n    const user = await response.json();\n    return user;\n}\n\n\/\/ \u7b49\u4ef7\u4e8e\nfunction fetchUserData(userId) {\n    return fetch('\/api\/users\/' + userId)\n        .then(response =&gt; response.json());\n}\n<\/code><\/pre>\n<h3>2. await \u8868\u8fbe\u5f0f<\/h3>\n<pre><code class=\"language-javascript\">\/\/ await \u53ea\u80fd\u5728 async \u51fd\u6570\u4e2d\u4f7f\u7528\nasync function example() {\n    \/\/ \u6682\u505c\u6267\u884c\uff0c\u7b49\u5f85 Promise \u89e3\u51b3\n    const data = await fetchData();\n    console.log(data);\n    \n    \/\/ await \u540e\u7684\u4ee3\u7801\u4f1a\u5728 data \u51c6\u5907\u597d\u540e\u6267\u884c\n    console.log('\u7ee7\u7eed\u6267\u884c');\n}\n<\/code><\/pre>\n<h3>3. \u9519\u8bef\u5904\u7406<\/h3>\n<pre><code class=\"language-javascript\">\/\/ \u4f7f\u7528 try\/catch\nasync function handleError() {\n    try {\n        const data = await riskyOperation();\n        return { success: true, data };\n    } catch (error) {\n        console.error('\u9519\u8bef:', error);\n        return { success: false, error: error.message };\n    }\n}\n<\/code><\/pre>\n<hr>\n<h2>\ud83d\udee0\ufe0f API \u51fd\u6570\u8be6\u89e3<\/h2>\n<h3>1. async \u51fd\u6570<\/h3>\n<pre><code class=\"language-javascript\">\/\/ async \u51fd\u6570\u58f0\u660e\nasync function getData() {\n    const response = await fetch('\/api\/data');\n    const data = await response.json();\n    return data;\n}\n\n\/\/ async \u7bad\u5934\u51fd\u6570\nconst getUser = async (id) =&gt; {\n    const response = await fetch('\/api\/users\/' + id);\n    return await response.json();\n};\n\n\/\/ async \u65b9\u6cd5\nconst obj = {\n    async fetchData() {\n        return await fetch('\/api\/data');\n    }\n};\n<\/code><\/pre>\n<h3>2. await \u8868\u8fbe\u5f0f<\/h3>\n<pre><code class=\"language-javascript\">\/\/ await \u7b49\u5f85 Promise \u89e3\u51b3\nconst result = await promise;\n\n\/\/ \u53ef\u4ee5 await \u4efb\u4f55 thenable \u5bf9\u8c61\nconst thenable = {\n    then: (resolve) =&gt; resolve('value')\n};\nconst value = await thenable;\n\n\/\/ await \u7684\u4f18\u5148\u7ea7\u4f4e\u4e8e\u8fd0\u7b97\u7b26\nconst sum = await promise1 + await promise2;  \/\/ \u5e76\u884c\u6267\u884c\n<\/code><\/pre>\n<h3>3. \u9519\u8bef\u5904\u7406<\/h3>\n<pre><code class=\"language-javascript\">\/\/ try\/catch\/finally\nasync function withFinally() {\n    try {\n        await resource.acquire();\n        await doWork();\n    } catch (error) {\n        console.error(error);\n    } finally {\n        await resource.release();  \/\/ \u603b\u662f\u6267\u884c\n    }\n}\n\n\/\/ \u6355\u83b7\u7279\u5b9a\u7c7b\u578b\u7684\u9519\u8bef\nasync function specificCatch() {\n    try {\n        await riskyOperation();\n    } catch (error) {\n        if (error instanceof NetworkError) {\n            console.log('\u7f51\u7edc\u9519\u8bef');\n        } else if (error instanceof ValidationError) {\n            console.log('\u9a8c\u8bc1\u9519\u8bef');\n        } else {\n            throw error;  \/\/ \u91cd\u65b0\u629b\u51fa\n        }\n    }\n}\n<\/code><\/pre>\n<hr>\n<h2>\ud83c\udfae \u5b9e\u6218\u793a\u4f8b<\/h2>\n<h3>\u793a\u4f8b 1\uff1a\u987a\u5e8f\u6267\u884c\u5f02\u6b65\u64cd\u4f5c<\/h3>\n<pre><code class=\"language-javascript\">\/\/ \u4f7f\u7528 async\/await \u987a\u5e8f\u6267\u884c\nasync function getDashboardData() {\n    const user = await getUser(1);\n    const posts = await getPosts(user.id);\n    const comments = await getComments(posts[0].id);\n    \n    return { user, posts, comments };\n}\n\n\/\/ \u76f8\u6bd4 then \u94fe\nfunction getDashboardDataOld() {\n    return getUser(1)\n        .then(user =&gt; getPosts(user.id))\n        .then(posts =&gt; getComments(posts[0].id));\n}\n<\/code><\/pre>\n<h3>\u793a\u4f8b 2\uff1a\u5e76\u884c\u6267\u884c\u5f02\u6b65\u64cd\u4f5c<\/h3>\n<pre><code class=\"language-javascript\">\/\/ \u5e76\u884c\u6267\u884c\u591a\u4e2a\u72ec\u7acb\u7684\u5f02\u6b65\u64cd\u4f5c\nasync function fetchAllData() {\n    const [users, posts, comments] = await Promise.all([\n        fetch('\/api\/users').then(r =&gt; r.json()),\n        fetch('\/api\/posts').then(r =&gt; r.json()),\n        fetch('\/api\/comments').then(r =&gt; r.json())\n    ]);\n    \n    return { users, posts, comments };\n}\n\n\/\/ \u4f7f\u7528 for...of \u5faa\u73af\nasync function fetchAllItems(urls) {\n    const results = [];\n    for (const url of urls) {\n        const response = await fetch(url);\n        const data = await response.json();\n        results.push(data);\n    }\n    return results;\n}\n<\/code><\/pre>\n<h3>\u793a\u4f8b 3\uff1a\u8d85\u65f6\u63a7\u5236<\/h3>\n<pre><code class=\"language-javascript\">\/\/ Promise.race + async\/await\nasync function fetchWithTimeout(url, timeout = 5000) {\n    const controller = new AbortController();\n    \n    const timeoutPromise = new Promise((_, reject) =&gt; {\n        setTimeout(() =&gt; {\n            controller.abort();\n            reject(new Error('\u8bf7\u6c42\u8d85\u65f6'));\n        }, timeout);\n    });\n    \n    try {\n        const response = await fetch(url, {\n            signal: controller.signal\n        });\n        return await response.json();\n    } catch (error) {\n        if (error.name === 'AbortError') {\n            throw new Error('\u8bf7\u6c42\u8d85\u65f6');\n        }\n        throw error;\n    }\n}\n<\/code><\/pre>\n<hr>\n<h2>\u26a0\ufe0f \u91cd\u8981\u6ce8\u610f\u4e8b\u9879<\/h2>\n<h3>1. async \u51fd\u6570\u603b\u662f\u8fd4\u56de Promise<\/h3>\n<pre><code class=\"language-javascript\">\/\/ \u6b63\u786e\uff1a\u53ef\u4ee5\u5229\u7528\u8fd4\u56de\u503c\nconst promise = async function() {\n    return 'value';\n};  \/\/ \u8fd4\u56de Promise\n\n\/\/ \u9519\u8bef\uff1a\u5fd8\u8bb0 await\nasync function wrong() {\n    const result = getData();  \/\/ \u5fc5\u987b\u52a0 await\uff01\n    console.log(result);  \/\/ \u8f93\u51fa Promise \u5bf9\u8c61\n}\n<\/code><\/pre>\n<h3>2. await \u53ea\u80fd\u5728 async \u51fd\u6570\u4e2d\u4f7f\u7528<\/h3>\n<pre><code class=\"language-javascript\">\/\/ \u6b63\u786e\uff1a\u5728 async \u51fd\u6570\u4e2d\u4f7f\u7528 await\nasync function correct() {\n    const data = await fetchData();\n    return data;\n}\n\n\/\/ \u9519\u8bef\uff1a\u5728\u975e async \u51fd\u6570\u4e2d\u4f7f\u7528 await\nfunction wrong() {\n    const data = await fetchData();  \/\/ SyntaxError!\n    return data;\n}\n<\/code><\/pre>\n<h3>3. \u907f\u514d Promise \u6784\u9020\u5668\u53cd\u6a21\u5f0f<\/h3>\n<pre><code class=\"language-javascript\">\/\/ \u274c \u9519\u8bef\uff1aPromise \u6784\u9020\u5668\u53cd\u6a21\u5f0f\nasync function wrong() {\n    return new Promise((resolve, reject) =&gt; {\n        const data = await fetchData();\n        resolve(data);\n    });\n}\n\n\/\/ \u2705 \u6b63\u786e\uff1a\u76f4\u63a5 await\nasync function correct() {\n    const data = await fetchData();\n    return data;\n}\n<\/code><\/pre>\n<h3>4. \u5e76\u884c\u6267\u884c\u6280\u5de7<\/h3>\n<pre><code class=\"language-javascript\">\/\/ \u4f7f\u7528 Promise.all \u5e76\u884c\nasync function parallel() {\n    const [result1, result2] = await Promise.all([\n        operation1(),\n        operation2()\n    ]);\n}\n\n\/\/ \u4f7f\u7528 for...of \u5e76\u884c\nasync function parallelLoop(items) {\n    const promises = items.map(item =&gt; processItem(item));\n    const results = await Promise.all(promises);\n    return results;\n}\n<\/code><\/pre>\n<hr>\n<h2>\ud83c\udf93 \u5b9e\u6218\u5e94\u7528\u573a\u666f<\/h2>\n<h3>\u573a\u666f 1: API \u8bf7\u6c42<\/h3>\n<pre><code class=\"language-javascript\">\/\/ \u83b7\u53d6\u7528\u6237\u5b8c\u6574\u4fe1\u606f\nasync function getUserInfo(userId) {\n    try {\n        const [profile, posts, friends] = await Promise.all([\n            fetch('\/api\/users\/' + userId + '\/profile').then(r =&gt; r.json()),\n            fetch('\/api\/users\/' + userId + '\/posts').then(r =&gt; r.json()),\n            fetch('\/api\/users\/' + userId + '\/friends').then(r =&gt; r.json())\n        ]);\n        \n        return {\n            profile,\n            posts,\n            friends\n        };\n    } catch (error) {\n        console.error('\u83b7\u53d6\u7528\u6237\u4fe1\u606f\u5931\u8d25:', error);\n        throw error;\n    }\n}\n<\/code><\/pre>\n<h3>\u573a\u666f 2: \u6587\u4ef6\u64cd\u4f5c<\/h3>\n<pre><code class=\"language-javascript\">\/\/ \u8bfb\u53d6\u591a\u4e2a\u6587\u4ef6\nasync function loadConfigFiles() {\n    const [config1, config2, config3] = await Promise.all([\n    readFile('.\/config1.json').then(JSON.parse),\n    readFile('.\/config2.json').then(JSON.parse),\n    readFile('.\/config3.json').then(JSON.parse)\n    ]);\n    \n    return { config1, config2, config3 };\n}\n\n\/\/ \u987a\u5e8f\u5904\u7406\u6587\u4ef6\nasync function processFiles(files) {\n    for (const file of files) {\n        const data = await readFile(file);\n        await processFile(data);\n        await writeFile('processed\/' + file, data);\n    }\n}\n<\/code><\/pre>\n<h3>\u573a\u666f 3: \u6570\u636e\u5e93\u67e5\u8be2<\/h3>\n<pre><code class=\"language-javascript\">\/\/ \u8fde\u63a5\u6c60\u67e5\u8be2\nasync function getUserWithPosts(userId) {\n    const client = await pool.connect();\n    \n    try {\n        const user = await client.query(\n            'SELECT * FROM users WHERE id = $1',\n            [userId]\n        );\n        \n        if (!user) {\n            throw new Error('\u7528\u6237\u4e0d\u5b58\u5728');\n        }\n        \n        const posts = await client.query(\n            'SELECT * FROM posts WHERE user_id = $1 ORDER BY created_at DESC',\n            [userId]\n        );\n        \n        return { ...user, posts };\n    } finally {\n        client.release();\n    }\n}\n<\/code><\/pre>\n<hr>\n<h2>\u270d\ufe0f \u7ec3\u4e60\u4efb\u52a1<\/h2>\n<h3>\u57fa\u7840\u7ec3\u4e60\uff08\u5fc5\u505a\uff09<\/h3>\n<ol>\n<li>\n<p><strong>async\/await \u8f6c\u6362<\/strong>\uff1a<\/p>\n<ul>\n<li>[ ] \u5c06 then \u90e8\u5206\u8f6c\u6362\u4e3a async\/await<\/li>\n<li>[ ] \u5c06\u56de\u8c03\u51fd\u6570\u8f6c\u6362\u4e3a async \u51fd\u6570<\/li>\n<li>[ ] \u5904\u7406\u9519\u8bef\u60c5\u51b5<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>\u9519\u8bef\u5904\u7406<\/strong>\uff1a<\/p>\n<ul>\n<li>[ ] \u4f7f\u7528 try\/catch \u6355\u83b7\u9519\u8bef<\/li>\n<li>[ ] \u533a\u5206\u4e0d\u540c\u7c7b\u578b\u7684\u9519\u8bef<\/li>\n<li>[ ] \u5b9e\u73b0\u91cd\u8bd5\u903b\u8f91<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>\u5e76\u884c\u6267\u884c<\/strong>\uff1a<\/p>\n<ul>\n<li>[ ] \u4f7f\u7528 Promise.all \u5e76\u884c\u8bf7\u6c42<\/li>\n<li>[ ] \u4f7f\u7528 for&#8230;of \u5e76\u884c\u5904\u7406\u6570\u7ec4<\/li>\n<li>[ ] \u5904\u7406\u90e8\u5206\u5931\u8d25\u7684\u60c5\u51b5<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<h3>\u8fdb\u9636\u7ec3\u4e60\uff08\u63a8\u8350\uff09<\/h3>\n<ol>\n<li>\n<p><strong>\u9ad8\u7ea7\u6a21\u5f0f<\/strong>\uff1a<\/p>\n<ul>\n<li>Promise.allSettled + async\/await<\/li>\n<li>\u5b9e\u73b0\u6279\u91cf\u64cd\u4f5c\uff08\u5e76\u884c\u3001\u4e32\u884c\u6df7\u5408\uff09<\/li>\n<li>\u5b9e\u73b0\u5e76\u53d1\u63a7\u5236\uff08\u9650\u5236\u5e76\u53d1\u6570\uff09<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>\u6027\u80fd\u4f18\u5316<\/strong>\uff1a<\/p>\n<ul>\n<li>\u907f\u514d\u4e0d\u5fc5\u8981\u7684 await<\/li>\n<li>\u4f7f\u7528\u7f13\u5b58\u51cf\u5c11\u8bf7\u6c42<\/li>\n<li>\u5b9e\u73b0\u8bf7\u6c42\u53bb\u91cd<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>\u5de5\u5177\u51fd\u6570<\/strong>\uff1a<\/p>\n<pre><code class=\"language-javascript\">\/\/ \u5ef6\u8fdf\u51fd\u6570\nconst delay = ms =&gt; new Promise(resolve =&gt; \n    setTimeout(resolve, ms)\n);\n\n\/\/ \u91cd\u8bd5\u51fd\u6570\nasync function retry(fn, maxRetries = 3, delay = 1000) {\n    for (let i = 0; i &lt; maxRetries; i++) {\n        try {\n            return await fn();\n        } catch (error) {\n            if (i === maxRetries - 1) throw error;\n            await delay(delay * (i + 1));\n        }\n    }\n}\n\n\/\/ \u8d85\u65f6\u51fd\u6570\nasync function withTimeout(promise, timeoutMs) {\n    const timeout = new Promise((_, reject) =&gt;\n        setTimeout(() =&gt; reject(new Error('\u8d85\u65f6')), timeoutMs)\n    );\n    return Promise.race([promise, timeout]);\n}\n<\/code><\/pre>\n<\/li>\n<\/ol>\n<h3>\u5b9e\u6218\u6311\u6218\uff08\u9009\u505a\uff09<\/h3>\n<ol>\n<li>\n<p><strong>\u5b9e\u73b0\u5e76\u53d1\u63a7\u5236<\/strong>\uff1a<\/p>\n<ul>\n<li>\u9650\u5236\u540c\u65f6\u6700\u591a N \u4e2a\u5e76\u53d1\u8bf7\u6c42<\/li>\n<li>\u961f\u5217\u7ba1\u7406\u5f85\u5904\u7406\u4efb\u52a1<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>\u5b9e\u73b0\u8fdb\u5ea6\u8ffd\u8e2a<\/strong>\uff1a<\/p>\n<ul>\n<li>\u62a5\u544a\u5904\u7406\u8fdb\u5ea6<\/li>\n<li>\u5b9e\u73b0\u8fdb\u5ea6\u6761\u663e\u793a<\/li>\n<li>\u652f\u6301\u53d6\u6d88\u64cd\u4f5c<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>\u5b9e\u73b0\u7f13\u5b58\u673a\u5236<\/strong>\uff1a<\/p>\n<ul>\n<li>\u5185\u5b58\u7f13\u5b58<\/li>\n<li>LocalStorage \u6301\u4e45\u5316<\/li>\n<li>\u7f13\u5b58\u5931\u6548\u7b56\u7565<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<hr>\n<h2>\ud83d\udca1 \u5e38\u89c1\u95ee\u9898 FAQ<\/h2>\n<h3>Q1: async\/await \u548c Promise \u6709\u4ec0\u4e48\u533a\u522b\uff1f<\/h3>\n<p><strong>A<\/strong>:<\/p>\n<ul>\n<li>async\/await \u662f Promise \u7684\u8bed\u6cd5\u7cd6<\/li>\n<li>async\/await \u8ba9\u5f02\u6b65\u4ee3\u7801\u770b\u8d77\u6765\u50cf\u540c\u6b65\u4ee3\u7801<\/li>\n<li>\u5e95\u5c42\u4ecd\u7136\u4f7f\u7528 Promise<\/li>\n<li>\u53ef\u4ee5\u6df7\u7528 Promise \u548c async\/await<\/li>\n<\/ul>\n<h3>Q2: \u5982\u4f55\u5904\u7406\u5faa\u73af\u4e2d\u7684 await\uff1f<\/h3>\n<p><strong>A<\/strong>:<\/p>\n<pre><code class=\"language-javascript\">\/\/ \u4e32\u884c\u6267\u884c\nfor (const item of items) {\n    await processItem(item);  \/\/ \u7b49\u5f85\u6bcf\u4e2a\u5b8c\u6210\n}\n\n\/\/ \u5e76\u884c\u6267\u884c\uff08\u9650\u5236\u5e76\u53d1\uff09\nconst concurrency = 5;\nfor (let i = 0; i &lt; items.length; i += concurrency) {\n    const batch = items.slice(i, i + concurrency);\n    await Promise.all(batch.map(processItem));\n}\n<\/code><\/pre>\n<h3>Q3: \u5982\u4f55\u907f\u514d\u963b\u585e\u4e8b\u4ef6\u5faa\u73af\uff1f<\/h3>\n<p><strong>A<\/strong>:<\/p>\n<ul>\n<li>\u4e0d\u8981\u5728\u5faa\u73af\u4e2d\u4f7f\u7528 await\uff08\u9664\u975e\u662f\u4e32\u884c\u573a\u666f\uff09<\/li>\n<li>\u4f7f\u7528 Promise.all() \u5e76\u884c\u5904\u7406<\/li>\n<li>\u5206\u6279\u5904\u7406\u5927\u91cf\u6570\u636e<\/li>\n<li>\u4f7f\u7528 setImmediate\/setTimeout \u8ba9\u51fa\u63a7\u5236\u6743<\/li>\n<\/ul>\n<h3>Q4: \u5982\u4f55\u8c03\u8bd5 async \u51fd\u6570\uff1f<\/h3>\n<p><strong>A<\/strong>:<\/p>\n<pre><code class=\"language-javascript\">\/\/ \u6dfb\u52a0\u65e5\u5fd7\nasync function debugExample() {\n    console.log('1. \u5f00\u59cb');\n    const result1 = await step1();\n    console.log('2. step1 \u5b8c\u6210');\n    const result2 = await step2();\n    console.log('3. step2 \u5b8c\u6210');\n    console.log('\u7ed3\u679c:', { result1, result2 });\n}\n<\/code><\/pre>\n<hr>\n<h2>\ud83d\udcda \u62d3\u62d3\u9605\u8bfb<\/h2>\n<h3>\u5b98\u65b9\u6587\u6863<\/h3>\n<ul>\n<li><a href=\"https:\/\/developer.mozilla.org\/zh-CN\/docs\/Web\/JavaScript\/Reference\/Statements\/async_function\">MDN &#8211; async function<\/a><\/li>\n<li><a href=\"https:\/\/developer.mozilla.org\/zh-CN\/docs\/Web\/JavaScript\/Reference\/Operators\/await\">MDN &#8211; await expression<\/a><\/li>\n<\/ul>\n<h3>\u63a8\u8350\u8d44\u6e90<\/h3>\n<ol>\n<li><a href=\"https:\/\/github.com\/getify\/You-Dont-Know-JS\/tree\/master\/async%20%26%20performance\">You Don&#8217;t Know JS &#8211; async &amp; performance<\/a><\/li>\n<li><a href=\"https:\/\/exploringjs.com\/\">Exploring JS &#8211; Async Functions<\/a><\/li>\n<li><a href=\"https:\/\/www.patterns.dev\/posts\/promise-patterns\">JavaScript Async Patterns<\/a><\/li>\n<\/ol>\n<h3>\u76f8\u5173\u5de5\u5177<\/h3>\n<ul>\n<li><a href=\"https:\/\/github.com\/sindresorhus\/p-limit\">p-limit<\/a> &#8211; \u5e76\u53d1\u63a7\u5236<\/li>\n<li><a href=\"https:\/\/github.com\/sindresorhus\/p-queue\">p-queue<\/a> &#8211; Promise \u961f\u5217<\/li>\n<li><a href=\"https:\/\/babeljs.io\/\">Babel.js<\/a> &#8211; \u7f16\u8bd1 async\/await<\/li>\n<\/ul>\n<hr>\n<h2>\ud83c\udf89 \u603b\u7ed3<\/h2>\n<p>\u4eca\u5929\u6211\u4eec\u6df1\u5165\u5b66\u4e60\u4e86 <strong>async\/await \u5f02\u6b65\u7f16\u7a0b<\/strong>\uff0c\u6db5\u76d6\u4e86\uff1a<\/p>\n<p>\u2705 <strong>async\/await \u8bed\u6cd5<\/strong>\uff1a\u8ba9\u5f02\u6b65\u4ee3\u7801\u50cf\u540c\u6b65\u4ee3\u7801<br \/>\n\u2705 <strong>\u9519\u8bef\u5904\u7406<\/strong>\uff1atry\/catch\u3001\u5f02\u5e38\u4f20\u64ad<br \/>\n\u2705 <strong>\u5e76\u884c\u5904\u7406<\/strong>\uff1a.Promise.all + async\/await<br \/>\n\u2705 <strong>\u6700\u4f73\u5b9e\u8df5<\/strong>\uff1a\u907f\u514d\u5e38\u89c1\u9677\u9631\u3001\u6027\u80fd\u4f18\u5316<br \/>\n\u2705 <strong>\u5b9e\u6218\u5e94\u7528<\/strong>\uff1aAPI \u8bf7\u6c42\u3001\u6587\u4ef6\u64cd\u4f5c\u3001\u6570\u636e\u5e93\u67e5\u8be2<\/p>\n<p><strong>async\/await \u662f\u73b0\u4ee3 JavaScript \u5f02\u6b65\u7f16\u7a0b\u7684\u4e3b\u6d41\u65b9\u5f0f<\/strong>\uff0c\u5b83\u8ba9\u5f02\u6b65\u4ee3\u7801\u66f4\u6613\u8bfb\u3001\u66f4\u6613\u7ef4\u62a4\u3002<\/p>\n<hr>\n<p><strong>\u4e0b\u4e00\u8282\u8bfe\u9884\u544a<\/strong>: Day 27 \u5c06\u5b66\u4e60 <strong>\u6a21\u5757\u5316\u5f00\u53d1\u4e0e\u6784\u5efa\u5de5\u5177<\/strong>\uff0c\u5b66\u4e60\u5982\u4f55\u7ec4\u7ec7\u5927\u578b\u9879\u76ee\uff01<\/p>\n<p>\ud83d\udcaa <strong>\u52a0\u6cb9\uff01\u575a\u6301\u5c31\u662f\u80dc\u5229\uff01<\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Day 26: \u5f02\u6b65\u7f16\u7a0basync\/await \ud83d\udcc5 \u65e5\u671f: 2026\u5e7403\u670818\u65e5 \ud83c\udfaf \u5b66\u4e60\u76ee\u6807: \u6df1\u5165\u7406\u89e3  &#8230; <a title=\"Day-26-\u5f02\u6b65\u7f16\u7a0basync-await\" class=\"read-more\" href=\"https:\/\/www.resilence.cn\/?p=296\" aria-label=\"\u7ee7\u7eed\u9605\u8bfbDay-26-\u5f02\u6b65\u7f16\u7a0basync-await\">\u9605\u8bfb\u66f4\u591a<\/a><\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-296","post","type-post","status-publish","format-standard","hentry","category-studycoding"],"_links":{"self":[{"href":"https:\/\/www.resilence.cn\/index.php?rest_route=\/wp\/v2\/posts\/296","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.resilence.cn\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.resilence.cn\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.resilence.cn\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.resilence.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=296"}],"version-history":[{"count":1,"href":"https:\/\/www.resilence.cn\/index.php?rest_route=\/wp\/v2\/posts\/296\/revisions"}],"predecessor-version":[{"id":297,"href":"https:\/\/www.resilence.cn\/index.php?rest_route=\/wp\/v2\/posts\/296\/revisions\/297"}],"wp:attachment":[{"href":"https:\/\/www.resilence.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=296"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.resilence.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=296"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.resilence.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=296"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}