{"id":294,"date":"2026-03-19T22:33:27","date_gmt":"2026-03-19T14:33:27","guid":{"rendered":"https:\/\/www.resilence.cn\/?p=294"},"modified":"2026-03-19T22:33:27","modified_gmt":"2026-03-19T14:33:27","slug":"day-25-%e5%bc%82%e6%ad%a5%e7%bc%96%e7%a8%8bpromise","status":"publish","type":"post","link":"https:\/\/www.resilence.cn\/?p=294","title":{"rendered":"Day-25-\u5f02\u6b65\u7f16\u7a0bPromise"},"content":{"rendered":"<h1>Day 25: \u5f02\u6b65\u7f16\u7a0bPromise<\/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\u5f02\u6b65\u7f16\u7a0b\u4e0e Promise\uff0c\u638c\u63e1\u5f02\u6b65\u64cd\u4f5c\u7684\u6700\u4f73\u5b9e\u8df5<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\u5f02\u6b65\u7f16\u7a0b\u6a21\u578b<\/strong>\uff1a\u4e8b\u4ef6\u5faa\u73af\u3001\u56de\u8c03\u961f\u5217<\/li>\n<li><strong>\u638c\u63e1 Promise \u7528\u6cd5<\/strong>\uff1a\u521b\u5efa\u3001\u94fe\u5f0f\u8c03\u7528\u3001\u9519\u8bef\u5904\u7406<\/li>\n<li><strong>\u5b66\u4f1a async\/await<\/strong>\uff1a\u5f02\u6b65\u4ee3\u7801\u7684\u540c\u6b65\u5199\u6cd5<\/li>\n<li><strong>\u5b9e\u8df5\u5e76\u884c\u5904\u7406<\/strong>\uff1aPromise.all\u3001race\u3001allSettled<\/li>\n<li><strong>\u5e94\u7528\u6700\u4f73\u5b9e\u8df5<\/strong>\uff1a\u9519\u8bef\u5904\u7406\u3001\u6027\u80fd\u4f18\u5316<\/li>\n<\/ol>\n<hr>\n<h2>\ud83d\udca1 \u6838\u5fc3\u6982\u5ff5<\/h2>\n<h3>1. \u540c\u6b65 vs \u5f02\u6b65<\/h3>\n<pre><code class=\"language-javascript\">\/\/ \u540c\u6b65\u4ee3\u7801\uff1a\u963b\u585e\u6267\u884c\nconsole.log('1');\nconst data = readFile('data.txt');  \/\/ \u963b\u585e\uff0c\u7b49\u5f85\u6587\u4ef6\u8bfb\u53d6\u5b8c\u6210\nconsole.log('2');\nconsole.log(data);\n\/\/ \u8f93\u51fa\uff1a1 -&gt; \u6570\u636e -&gt; 2\n\n\/\/ \u5f02\u6b65\u4ee3\u7801\uff1a\u975e\u963b\u585e\u6267\u884c\nconsole.log('1');\nreadFile('data.txt', (err, data) =&gt; {\n    console.log(data);\n});\nconsole.log('2');\n\/\/ \u8f93\u51fa\uff1a1 -&gt; 2 -&gt; \u6570\u636e\n<\/code><\/pre>\n<h3>2. \u56de\u8c03\u51fd\u6570\u7684\u95ee\u9898<\/h3>\n<pre><code class=\"language-javascript\">\/\/ \u56de\u8c03\u5730\u72f1\uff08Callback Hell\uff09\ngetData(id, (data) =&gt; {\n    getMoreData(data.id, (moreData) =&gt; {\n        getEvenMoreData(moreData.id, (evenMoreData) =&gt; {\n            \/\/ \u7ee7\u7eed\u5d4c\u5957...\n        });\n    });\n});\n<\/code><\/pre>\n<h3>3. Promise \u57fa\u7840<\/h3>\n<pre><code class=\"language-javascript\">\/\/ \u521b\u5efa Promise\nconst promise = new Promise((resolve, reject) =&gt; {\n    \/\/ \u5f02\u6b65\u64cd\u4f5c\n    const success = true;\n    \n    if (success) {\n        resolve('\u64cd\u4f5c\u6210\u529f');  \/\/ \u6210\u529f\u65f6\u8c03\u7528\n    } else {\n        reject('\u64cd\u4f5c\u5931\u8d25');   \/\/ \u5931\u8d25\u65f6\u8c03\u7528\n    }\n});\n\n\/\/ \u4f7f\u7528 Promise\npromise\n    .then(result =&gt; console.log(result))\n    .catch(error =&gt; console.error(error));\n<\/code><\/pre>\n<hr>\n<h2>\ud83d\udee0\ufe0f API \u51fd\u6570\u8be6\u89e3<\/h2>\n<h3>1. Promise \u6784\u9020\u51fd\u6570<\/h3>\n<pre><code class=\"language-javascript\">const myPromise = new Promise((resolve, reject) =&gt; {\n    \/\/ executor \u51fd\u6570\uff1a\u6267\u884c\u5f02\u6b65\u64cd\u4f5c\n    \/\/ resolve\uff1a\u6210\u529f\u65f6\u8c03\u7528\n    \/\/ reject\uff1a\u5931\u8d25\u65f6\u8c03\u7528\n    \n    setTimeout(() =&gt; {\n        const success = Math.random() &gt; 0.5;\n        if (success) {\n            resolve('\u6570\u636e\u52a0\u8f7d\u6210\u529f');\n        } else {\n            reject(new Error('\u6570\u636e\u52a0\u8f7d\u5931\u8d25'));\n        }\n    }, 1000);\n});\n<\/code><\/pre>\n<h3>2. Promise \u5b9e\u4f8b\u65b9\u6cd5<\/h3>\n<pre><code class=\"language-javascript\">\/\/ then()\uff1a\u5904\u7406\u6210\u529f\u72b6\u6001\npromise.then(value =&gt; {\n    console.log('\u6210\u529f:', value);\n    return value + 1;  \/\/ \u8fd4\u56de\u503c\u4f20\u9012\u7ed9\u4e0b\u4e00\u4e2a then\n}).then(newValue =&gt; {\n    console.log('\u65b0\u503c:', newValue);\n});\n\n\/\/ catch()\uff1a\u5904\u7406\u5931\u8d25\u72b6\u6001\npromise.catch(error =&gt; {\n    console.error('\u9519\u8bef:', error.message);\n});\n\n\/\/ finally()\uff1a\u65e0\u8bba\u6210\u529f\u5931\u8d25\u90fd\u6267\u884c\npromise.finally(() =&gt; {\n    console.log('\u6e05\u7406\u8d44\u6e90');\n});\n<\/code><\/pre>\n<h3>3. Promise \u9759\u6001\u65b9\u6cd5<\/h3>\n<pre><code class=\"language-javascript\">\/\/ Promise.all\uff1a\u6240\u6709 Promise \u90fd\u6210\u529f\u624d\u6210\u529f\nconst p1 = Promise.resolve(1);\nconst p2 = Promise.resolve(2);\nconst p3 = Promise.resolve(3);\n\nPromise.all([p1, p2, p3])\n    .then(values =&gt; {\n        console.log(values);  \/\/ [1, 2, 3]\n    })\n    .catch(error =&gt; {\n        console.error('\u81f3\u5c11\u4e00\u4e2a\u5931\u8d25:', error);\n    });\n\n\/\/ Promise.race\uff1a\u7b2c\u4e00\u4e2a\u5b8c\u6210\u7684 Promise \u7ed3\u679c\nconst fast = new Promise(resolve =&gt; setTimeout(() =&gt; resolve('\u5feb'), 100));\nconst slow = new Promise(resolve =&gt; setTimeout(() =&gt; resolve('\u6162'), 200));\n\nPromise.race([fast, slow])\n    .then(value =&gt; console.log(value));  \/\/ '\u5feb'\n\n\/\/ Promise.allSettled\uff1a\u8fd4\u56de\u6240\u6709 Promise \u7684\u7ed3\u679c\nconst p1 = Promise.resolve(1);\nconst p2 = Promise.reject(2);\n\nPromise.allSettled([p1, p2])\n    .then(results =&gt; {\n        console.log(results);\n        \/\/ [\n        \/\/   { status: 'fulfilled', value: 1 },\n        \/\/   { status: 'rejected', reason: 2 }\n        \/\/ ]\n    });\n<\/code><\/pre>\n<hr>\n<h2>\ud83c\udfae \u5b9e\u6218\u793a\u4f8b<\/h2>\n<h3>\u793a\u4f8b 1\uff1a\u5c01\u88c5\u5f02\u6b65\u64cd\u4f5c<\/h3>\n<pre><code class=\"language-javascript\">\/\/ \u5c01\u88c5 fetch \u4e3a Promise\nfunction fetchJSON(url) {\n    return new Promise((resolve, reject) =&gt; {\n        fetch(url)\n            .then(response =&gt; {\n                if (!response.ok) {\n                    throw new Error('HTTP ' + response.status);\n                }\n                return response.json();\n            })\n            .then(data =&gt; resolve(data))\n            .catch(error =&gt; reject(error));\n    });\n}\n\n\/\/ \u4f7f\u7528\nfetchJSON('\/api\/data')\n    .then(data =&gt; console.log(data))\n    .catch(error =&gt; console.error(error));\n<\/code><\/pre>\n<h3>\u793a\u4f8b 2\uff1a\u5f02\u6b65\u6587\u4ef6\u64cd\u4f5c<\/h3>\n<pre><code class=\"language-javascript\">\/\/ \u8bfb\u53d6\u6587\u4ef6\u7684 Promise \u7248\u672c\uff08Node.js\uff09\nfunction readFilePromise(path) {\n    return new Promise((resolve, reject) =&gt; {\n        fs.readFile(path, 'utf8', (err, data) =&gt; {\n            if (err) {\n                reject(err);\n            } else {\n                resolve(data);\n            }\n        });\n    });\n}\n\n\/\/ \u4f7f\u7528\nreadFilePromise('.\/data.txt')\n    .then(data =&gt; console.log(data))\n    .catch(err =&gt; console.error('\u8bfb\u53d6\u5931\u8d25:', err));\n<\/code><\/pre>\n<h3>\u793a\u4f8b 3\uff1a\u987a\u5e8f\u6267\u884c\u591a\u4e2a\u5f02\u6b65\u64cd\u4f5c<\/h3>\n<pre><code class=\"language-javascript\">\/\/ \u987a\u5e8f\u6267\u884c\uff1a\u4f7f\u7528 then \u94fe\nfunction getUser(id) {\n    return fetch('\/api\/users\/' + id).then(r =&gt; r.json());\n}\n\nfunction getPosts(userId) {\n    return fetch('\/api\/users\/' + userId + '\/posts').then(r =&gt; r.json());\n}\n\nfunction getComments(postId) {\n    return fetch('\/api\/posts\/' + postId + '\/comments').then(r =&gt; r.json());\n}\n\n\/\/ \u4f9d\u6b21\u6267\u884c\ngetUser(1)\n    .then(user =&gt; getPosts(user.id))\n    .then(posts =&gt; getComments(posts[0].id))\n    .then(comments =&gt; console.log(comments))\n    .catch(error =&gt; console.error(error));\n<\/code><\/pre>\n<hr>\n<h2>\u26a0\ufe0f \u91cd\u8981\u6ce8\u610f\u4e8b\u9879<\/h2>\n<h3>1. \u603b\u662f\u8fd4\u56de\u6216\u4f20\u9012 Promise<\/h3>\n<pre><code class=\"language-javascript\">\/\/ \u6b63\u786e\uff1a\u603b\u662f\u8fd4\u56de Promise\nfunction getData() {\n    return fetch('\/api\/data').then(r =&gt; r.json());\n}\n\n\/\/ \u9519\u8bef\uff1a\u4e0d\u8fd4\u56de Promise\nfunction getData() {\n    fetch('\/api\/data').then(r =&gt; r.json());\n    \/\/ \u8c03\u7528\u8005\u65e0\u6cd5\u83b7\u53d6\u7ed3\u679c\n}\n<\/code><\/pre>\n<h3>2. \u603b\u662f\u5904\u7406\u9519\u8bef<\/h3>\n<pre><code class=\"language-javascript\">\/\/ \u6b63\u786e\uff1a\u603b\u662f\u5904\u7406\u9519\u8bef\npromise\n    .then(data =&gt; processData(data))\n    .catch(error =&gt; handleError(error));\n\n\/\/ \u9519\u8bef\uff1a\u4e0d\u5904\u7406\u9519\u8bef\npromise.then(data =&gt; processData(data));\n    \/\/ \u9519\u8bef\u4f1a\u53d8\u6210\u672a\u6355\u83b7\u7684 Promise rejection\n<\/code><\/pre>\n<h3>3. \u907f\u514d\u5d4c\u5957 Promise<\/h3>\n<pre><code class=\"language-javascript\">\/\/ \u6b63\u786e\uff1a\u6241\u5e73\u5316 then \u94fe\npromise1\n    .then(result1 =&gt; {\n        return promise2(result1);\n    })\n    .then(result2 =&gt; {\n        return promise3(result2);\n    });\n\n\/\/ \u9519\u8bef\uff1a\u5d4c\u5957 Promise\npromise1.then(result1 =&gt; {\n    promise2(result1).then(result2 =&gt; {\n        promise3(result2).then(result3 =&gt; {\n            \/\/ \u53c8\u662f\u56de\u8c03\u5730\u72f1\n        });\n    });\n});\n<\/code><\/pre>\n<h3>4. Promise \u72b6\u6001\u4e0d\u53ef\u9006<\/h3>\n<pre><code class=\"language-javascript\">const promise = new Promise((resolve) =&gt; {\n    resolve('\u7b2c\u4e00\u6b21');\n    resolve('\u7b2c\u4e8c\u6b21');  \/\/ \u65e0\u6548\uff0cPromise \u72b6\u6001\u4e0d\u4f1a\u6539\u53d8\n    reject('\u5931\u8d25');      \/\/ \u65e0\u6548\n});\n\npromise.then(console.log);  \/\/ \u53ea\u8f93\u51fa '\u7b2c\u4e00\u6b21'\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\">\/\/ \u5e76\u884c\u8bf7\u6c42\u591a\u4e2a API\nasync function getDashboardData() {\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<\/code><\/pre>\n<h3>\u573a\u666f 2: \u8d85\u65f6\u63a7\u5236<\/h3>\n<pre><code class=\"language-javascript\">\/\/ Promise.race \u5b9e\u73b0\u8d85\u65f6\nfunction fetchWithTimeout(url, timeout = 5000) {\n    const fetchPromise = fetch(url);\n    const timeoutPromise = new Promise((_, reject) =&gt;\n        setTimeout(() =&gt; reject(new Error('\u8bf7\u6c42\u8d85\u65f6')), timeout)\n    );\n    \n    return Promise.race([fetchPromise, timeoutPromise]);\n}\n<\/code><\/pre>\n<h3>\u573a\u666f 3: \u56fe\u7247\u9884\u52a0\u8f7d<\/h3>\n<pre><code class=\"language-javascript\">\/\/ Promise.all \u9884\u52a0\u8f7d\u591a\u5f20\u56fe\u7247\nfunction preloadImages(urls) {\n    const promises = urls.map(url =&gt; {\n        return new Promise((resolve, reject) =&gt; {\n            const img = new Image();\n            img.onload = () =&gt; resolve(url);\n            img.onerror = () =&gt; reject(new Error('\u52a0\u8f7d\u5931\u8d25: ' + url));\n            img.src = url;\n        });\n    });\n    \n    return Promise.all(promises);\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>Promise \u521b\u5efa<\/strong>\uff1a<\/p>\n<ul>\n<li>[ ] \u521b\u5efa\u4e00\u4e2a\u5ef6\u8fdf 2 \u79d2\u540e\u8fd4\u56de\u7684 Promise<\/li>\n<li>[ ] \u521b\u5efa\u4e00\u4e2a\u968f\u673a\u6210\u529f\/\u5931\u8d25\u7684 Promise<\/li>\n<li>[ ] \u4f7f\u7528 then\/catch \u5904\u7406\u7ed3\u679c<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>\u94fe\u5f0f\u8c03\u7528<\/strong>\uff1a<\/p>\n<ul>\n<li>[ ] \u5b9e\u73b0\u81f3\u5c11 3 \u4e2a then \u7684\u94fe\u5f0f\u8c03\u7528<\/li>\n<li>[ ] \u5728 then \u4e2d\u8fd4\u56de\u65b0\u7684 Promise<\/li>\n<li>[ ] \u4f7f\u7528 finally \u6e05\u7406\u8d44\u6e90<\/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>\u5e76\u884c\u64cd\u4f5c<\/strong>\uff1a<\/p>\n<ul>\n<li>\u4f7f\u7528 Promise.all \u5e76\u884c\u8bf7\u6c42 3 \u4e2a API<\/li>\n<li>\u4f7f\u7528 Promise.race \u5b9e\u73b0\u8bf7\u6c42\u8d85\u65f6<\/li>\n<li>\u4f7f\u7528 Promise.allSettled \u5904\u7406\u90e8\u5206\u5931\u8d25<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>\u9519\u8bef\u5904\u7406<\/strong>\uff1a<\/p>\n<ul>\n<li>\u5b9e\u73b0\u7edf\u4e00\u7684\u9519\u8bef\u5904\u7406\u51fd\u6570<\/li>\n<li>\u533a\u5206\u4e0d\u540c\u7c7b\u578b\u7684\u9519\u8bef<\/li>\n<li>\u63d0\u4f9b\u53cb\u597d\u7684\u9519\u8bef\u63d0\u793a<\/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\nfunction delay(ms) {\n    return new Promise(resolve =&gt; setTimeout(resolve, ms));\n}\n\n\/\/ \u91cd\u8bd5\u51fd\u6570\nasync function retry(fn, maxRetries = 3) {\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(1000 * (i + 1));\n        }\n    }\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 Promise \u65b9\u6cd5<\/strong>\uff1a<\/p>\n<ul>\n<li>Promise.map\uff1a\u5e76\u884c\u5904\u7406\u6570\u7ec4<\/li>\n<li>Promise.filter\uff1a\u5e76\u884c\u8fc7\u6ee4\u6570\u7ec4<\/li>\n<li>Promise.reduce\uff1a\u5e76\u884c\u5f52\u7ea6\u6570\u7ec4<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>\u53d6\u6d88\u673a\u5236<\/strong>\uff1a<\/p>\n<ul>\n<li>\u5b9e\u73b0 AbortController<\/li>\n<li>\u5728\u8d85\u65f6\u6216\u53d6\u6d88\u65f6\u6e05\u7406\u8d44\u6e90<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>\u8fdb\u5ea6\u8ffd\u8e2a<\/strong>\uff1a<\/p>\n<ul>\n<li>\u62a5\u544a\u591a\u4e2a Promise \u7684\u5b8c\u6210\u8fdb\u5ea6<\/li>\n<li>\u5b9e\u73b0\u8fdb\u5ea6\u6761\u663e\u793a<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<hr>\n<h2>\ud83d\udca1 \u5e38\u89c1\u95ee\u9898 FAQ<\/h2>\n<h3>Q1: \u5982\u4f55\u8c03\u8bd5 Promise \u94fe\uff1f<\/h3>\n<p><strong>A<\/strong>:<\/p>\n<pre><code class=\"language-javascript\">\/\/ \u5728 then \u4e2d\u6dfb\u52a0\u65e5\u5fd7\npromise\n    .then(data =&gt; {\n        console.log('Step 1:', data);\n        return nextStep(data);\n    })\n    .then(data =&gt; {\n        console.log('Step 2:', data);\n        return finalStep(data);\n    });\n<\/code><\/pre>\n<h3>Q2: \u5982\u4f55\u5904\u7406\u591a\u4e2a\u72ec\u7acb\u7684\u9519\u8bef\uff1f<\/h3>\n<p><strong>A<\/strong>:<\/p>\n<pre><code class=\"language-javascript\">\/\/ \u6bcf\u4e2a\u64cd\u4f5c\u72ec\u7acb\u9519\u8bef\u5904\u7406\nconst promises = tasks.map(task =&gt;\n    task().catch(error =&gt; ({ error, task }))\n);\n\nconst results = await Promise.all(promises);\n<\/code><\/pre>\n<h3>Q3: Promise \u548c async\/await \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>Q4: \u5982\u4f55\u907f\u514d\u672a\u6355\u83b7\u7684 Promise rejection\uff1f<\/h3>\n<p><strong>A<\/strong>:<\/p>\n<pre><code class=\"language-javascript\">\/\/ \u5168\u5c40\u672a\u6355\u83b7 rejection \u5904\u7406\uff08Node.js\uff09\nprocess.on('unhandledRejection', (reason, promise) =&gt; {\n    console.error('\u672a\u6355\u83b7\u7684 Promise rejection:', reason);\n});\n\n\/\/ \u6216\u5728\u6d4f\u89c8\u5668\u4e2d\nwindow.addEventListener('unhandledrejection', (event) =&gt; {\n    console.error('\u672a\u6355\u83b7\u7684 Promise rejection:', event.reason);\n    event.preventDefault();  \/\/ \u963b\u6b62\u9ed8\u8ba4\u7684\u63a7\u5236\u53f0\u9519\u8bef\n});\n<\/code><\/pre>\n<hr>\n<h2>\ud83d\udcda \u62d3\u5c55\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\/Global_Objects\/Promise\">MDN &#8211; Promise<\/a><\/li>\n<li><a href=\"https:\/\/developer.mozilla.org\/zh-CN\/docs\/Web\/JavaScript\/Reference\/Statements\/async_function\">MDN &#8211; async\/await<\/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:\/\/javascript.info\/promise-basics\">Promise \u8be6\u89e3<\/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:\/\/bluebirdjs.com\/\">Bluebird<\/a> &#8211; \u529f\u80fd\u4e30\u5bcc\u7684 Promise \u5e93<\/li>\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<\/ul>\n<hr>\n<h2>\ud83c\udf89 \u603b\u7ed3<\/h2>\n<p>\u4eca\u5929\u6211\u4eec\u6df1\u5165\u5b66\u4e60\u4e86 <strong>\u5f02\u6b65\u7f16\u7a0b\u4e0e Promise<\/strong>\uff0c\u6db5\u76d6\u4e86\uff1a<\/p>\n<p>\u2705 <strong>\u5f02\u6b65\u7f16\u7a0b\u6a21\u578b<\/strong>\uff1a\u7406\u89e3\u4e8b\u4ef6\u5faa\u73af\u548c\u975e\u963b\u585e I\/O<br \/>\n\u2705 <strong>Promise \u7528\u6cd5<\/strong>\uff1a\u521b\u5efa\u3001\u94fe\u5f0f\u8c03\u7528\u3001\u9519\u8bef\u5904\u7406<br \/>\n\u2705 <strong>\u5e76\u884c\u5904\u7406<\/strong>\uff1aPromise.all\u3001race\u3001allSettled<br \/>\n\u2705 <strong>\u6700\u4f73\u5b9e\u8df5<\/strong>\uff1a\u9519\u8bef\u5904\u7406\u3001\u6027\u80fd\u4f18\u5316<br \/>\n\u2705 <strong>\u5b9e\u6218\u5e94\u7528<\/strong>\uff1aAPI \u8bf7\u6c42\u3001\u8d85\u65f6\u63a7\u5236\u3001\u56fe\u7247\u9884\u52a0\u8f7d<\/p>\n<p><strong>Promise \u662f\u73b0\u4ee3 JavaScript \u5f02\u6b65\u7f16\u7a0b\u7684\u57fa\u7840<\/strong>\uff0c\u638c\u63e1\u5b83\u5bf9\u4e8e\u7406\u89e3 async\/await \u548c\u66f4\u590d\u6742\u7684\u5f02\u6b65\u6a21\u5f0f\u81f3\u5173\u91cd\u8981\u3002<\/p>\n<hr>\n<p><strong>\u4e0b\u4e00\u8282\u8bfe\u9884\u544a<\/strong>: Day 26 \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 25: \u5f02\u6b65\u7f16\u7a0bPromise \ud83d\udcc5 \u65e5\u671f: 2026\u5e7403\u670818\u65e5 \ud83c\udfaf \u5b66\u4e60\u76ee\u6807: \u6df1\u5165\u7406\u89e3\u5f02\u6b65\u7f16\u7a0b\u4e0e &#8230; <a title=\"Day-25-\u5f02\u6b65\u7f16\u7a0bPromise\" class=\"read-more\" href=\"https:\/\/www.resilence.cn\/?p=294\" aria-label=\"\u7ee7\u7eed\u9605\u8bfbDay-25-\u5f02\u6b65\u7f16\u7a0bPromise\">\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-294","post","type-post","status-publish","format-standard","hentry","category-studycoding"],"_links":{"self":[{"href":"https:\/\/www.resilence.cn\/index.php?rest_route=\/wp\/v2\/posts\/294","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=294"}],"version-history":[{"count":1,"href":"https:\/\/www.resilence.cn\/index.php?rest_route=\/wp\/v2\/posts\/294\/revisions"}],"predecessor-version":[{"id":295,"href":"https:\/\/www.resilence.cn\/index.php?rest_route=\/wp\/v2\/posts\/294\/revisions\/295"}],"wp:attachment":[{"href":"https:\/\/www.resilence.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=294"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.resilence.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=294"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.resilence.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=294"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}