{"id":488,"date":"2022-09-25T11:13:36","date_gmt":"2022-09-25T03:13:36","guid":{"rendered":"http:\/\/gjweb.top\/?p=488"},"modified":"2022-09-25T11:13:37","modified_gmt":"2022-09-25T03:13:37","slug":"promise-%e4%b8%93%e9%a2%98","status":"publish","type":"post","link":"https:\/\/gjweb.top\/?p=488","title":{"rendered":"promise \u4e13\u9898"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\" id=\"promise-\u57fa\u672c\u6982\u5ff5\">promise \u57fa\u672c\u6982\u5ff5<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>promise \u662f\u4e00\u4e2a\u6784\u9020\u51fd\u6570, \u5fc5\u987b\u4f20\u4e00\u4e2a executor \u6267\u884c\u5668<\/li><li>executor \u4f1a\u7acb\u523b\u6267\u884c,\u5e76\u4f20\u5165 resolve \u548c reject \u53c2\u6570<\/li><li>promise \u4e09\u79cd\u72b6\u6001: fulfilled\u6210\u529f reject \u5931\u8d25 pending\u7b49\u5f85<\/li><li>\u53ef\u4ee5\u901a\u8fc7 resolve \u548c reject \u6765\u6539\u53d8\u72b6\u6001, \u540c\u65f6\u8c03\u7528\u5bf9\u5e94\u7684\u56de\u8c03<ul><li>\u4e00\u4e2a promise \u5b9e\u4f8b\u72b6\u6001\u6539\u53d8\u540e,\u4e0d\u80fd\u518d\u91cd\u65b0\u53d1\u751f\u65b0\u7684\u53d8\u5316<\/li><\/ul><\/li><li>\u5f53 executor \u6709\u5f02\u5e38\u65f6,\u4e5f\u4f1a\u89e6\u53d1 promise \u7684\u5931\u8d25 (reject)<\/li><\/ul>\n\n\n\n<p>\u901a\u8fc7\u4e0a\u65b9\u7684\u63cf\u8ff0 \u6211\u4eec\u6765\u6784\u5efa\u6700\u57fa\u672c\u7684\u4ee3\u7801\u6846\u67b6<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>const FULFILLED = \"FULFILLED\"<br>const REJECTED = \"REJECTED\"<br>const PENDING = \"PENDING\"<br>\u200b<br>class Promise {<br> &nbsp; &nbsp;constructor(executor){<br> &nbsp; &nbsp; &nbsp; &nbsp;this.state = PENDING; \/\/ promise \u7684\u72b6\u6001\uff0c\u9ed8\u8ba4\u662f PENDING<br> &nbsp; &nbsp; &nbsp; &nbsp;this.value = null; &nbsp;\/\/ \u6210\u529f\u72b6\u6001\u7684\u63a5\u53d7\u53c2\u6570<br> &nbsp; &nbsp; &nbsp; &nbsp;this.reason = null; \/\/ \u5931\u8d25\u540e\u72b6\u6001\u7684\u53c2\u6570<br> &nbsp; &nbsp; &nbsp; &nbsp;this.onFulfilledCallbasks = &#91;]; \/\/ \u5f02\u6b65\u72b6\u6001\u4e0b\u6210\u529f\u7684\u56de\u8c03\u51fd\u6570\u96c6\u5408<br> &nbsp; &nbsp; &nbsp; &nbsp;this.onRejectedCallbacks = &#91;]; &nbsp;\/\/ \u5f02\u6b65\u72b6\u6001\u4e0b\u5931\u8d25\u7684\u56de\u8c03\u51fd\u6570\u51e0\u4e2a<br> &nbsp; &nbsp; &nbsp; &nbsp;const resolve = (value)=&gt;{ \/\/ \u6210\u529f\u540e\u8c03\u7528\u7684\u51fd\u6570<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if(this.state === PENDING){ \/\/ \u9632\u6b62\u4e00\u6b21promise\u89e6\u53d1\u591a\u4e2a\u72b6\u6001<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;this.state = FULFILLED; \/\/ \u5c06\u72b6\u6001\u6539\u4e3a\u6210\u529f<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;this.value = value; \/\/\u5c06\u6210\u529f\u7684\u5185\u5bb9\u8d4b\u503c\u7ed9 value \u53d8\u91cf\uff0c\u4f9b\u7ed9 then \u8c03\u7528<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;this.onFUliflledCallbasks.forEach(item=&gt;{item()}) \/\/ j\u6267\u884c\u5f02\u6b65\u7684\u56de\u8c03\u961f\u5217<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  }<br> &nbsp; &nbsp; &nbsp;  }<br> &nbsp; &nbsp; &nbsp; &nbsp;const reject = (reason)=&gt;{ \/\/ \u5931\u8d25\u540e\u8c03\u7528\u7684\u51fd\u6570<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(this.state === PENDING){<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;this.state = REJECTED; \/\/ \u5c06\u72b6\u6001\u6539\u4e3a\u5931\u8d25<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;this.reason = reason; \/\/ \u5c06\u5931\u8d25\u7684\u5185\u5bb9\u8d4b\u503c\u7ed9 reason \u53d8\u91cf,\u4f9b\u7ed9 then \u8c03\u7528<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; this.onRejectedCallbasks.forEach(item=&gt;{item()} \/\/\u6267\u884c\u5f02\u6b65\u56de\u8c03\u7684\u961f\u5217<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  }<br> &nbsp; &nbsp; &nbsp;  }<br> &nbsp; &nbsp; &nbsp; &nbsp;try{<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;exectuor(resolve,reject) \/\/ exectuor\u4f1a\u7acb\u5373\u6267\u884c,\u4f20\u5165resolve,reject\u4e24\u4e2a\u53c2\u6570<br> &nbsp; &nbsp; &nbsp;  }catch(err){<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;reject(err) \/\/ \u5982\u679c exectuor\u53d1\u751f\u5f02\u5e38\u5219\u76f4\u63a5 reject<br> &nbsp; &nbsp; &nbsp;  }<br> &nbsp;  }<br> &nbsp; &nbsp; &nbsp; &nbsp;<br> &nbsp; &nbsp;then(onFulfilled,onRejected){ \/\/ \u63a5\u6536\u4e00\u4e2a\u6210\u529f , \u5931\u8d25\u7684\u56de\u8c03<br> &nbsp; &nbsp; &nbsp; &nbsp;let promise2 = new Promise((resolve,reject)=&gt;{ <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if(this.state === FULFILLED){ \/\/ \u5982\u679c\u5403\u6210\u529f\u72b6\u6001,\u5219\u8c03\u7528resolve<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;let x = onFulfilled(this.value)<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;resolve(x)<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  }<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if(this.state === REJECTED){ \/\/ \u5982\u679c\u662f\u5931\u8d25\u72b6\u6001,\u5219\u8c03\u7528reject<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;let x = onRejected(this.reason)<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;reject(x)<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  }<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if(this.state === PENDING){<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;this.onFulfilledCallbacks.push(()=&gt;{ \/\/ \u5f02\u6b65\u7684\u6210\u529f\u56de\u8c03<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;let x = onFulfilled(this.value)<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;      resolve(x)<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  })<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;this.onRejectedCallbacks,push(()=&gt;{ \/\/ \u5f02\u6b65\u7684\u5931\u8d25\u56de\u8c03<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;let x = onRejected(this.reason)<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;      reject(x)<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  })<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  }<br> &nbsp; &nbsp; &nbsp;  })<br> &nbsp;  }<br>}<br>export default Promise<br>\u200b<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"then-\u94fe\u7684\u7279\u70b9\">then \u94fe\u7684\u7279\u70b9<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>\u5f53 then \u4e2d\u6210\u529f\u548c\u5931\u8d25\u7684\u56de\u8c03\u8fd4\u56de\u4e00\u4e2a promise \u65f6,\u5185\u90e8\u4f1a\u89e3\u6790\u548c\u8fd9\u4e2a promise, \u5e76\u4e14\u5c06\u7ed3\u679c\u4f20\u9012\u7ed9\u5916\u5c42\u7684\u4e0b\u4e00\u4e2a then<\/li><li>\u4e0b\u4e00\u6b21 then \u7684\u6210\u529f\u548c\u5931\u8d25,\u53d6\u51b3\u4e8e\u5f53\u524d\u7684 promise \u72b6\u6001<\/li><li>\u5982\u679c\u6210\u529f\u548c\u5931\u8d25\u8fd4\u56de\u7684\u4e0d\u662f\u4e00\u4e2a promise ,\u5219\u76f4\u63a5\u7ed9\u4e0b\u4e00\u4e2a then \u7684\u6210\u529f<\/li><li>\u5982\u679c\u6210\u529f\u548c\u5931\u8d25\u7684\u56de\u8c03\u51fa\u73b0\u5f02\u5e38,\u5219\u76f4\u63a5\u4f20\u9012\u7ed9\u4e0b\u4e00\u4e2a then \u7684\u5931\u8d25<\/li><\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"resolvepromise-\u5b9e\u73b0\u903b\u8f91\">resolvePromise \u5b9e\u73b0\u903b\u8f91<\/h3>\n\n\n\n<p>\u5224\u65ad then \u7684\u8f93\u5165\u65b9\u5f0f\uff0c\u9700\u8981\u5355\u72ec\u5c01\u88c5\u4e00\u4e2a resolvePromise \u51fd\u6570\u8fdb\u884c\u94fe\u8def\u5224\u65ad\u548c\u5f15\u5bfc<\/p>\n\n\n\n<p>\u89c4\u8303<\/p>\n\n\n\n<p>resolvePromise\u5171\u63a5\u6536\u56db\u4e2a\u53c2\u6570 promise , x , resolve , reject<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>\u5982\u679c x \u548c promise2 \u5f15\u7528\u7684\u662f\u540c\u4e00\u4e2a\u5bf9\u8c61\u5c31\u4f1a\u9020\u6210\u6b7b\u5faa\u73af, \u9700\u8981 reject \u76f4\u63a5\u629b\u51fa\u5f02\u5e38<\/li><li>\u5224\u65ad x \u662f\u5426\u4e3a promise<ul><li>\u7f29\u5c0f\u8303\u56f4 (x===&#8221;object&#8221; &amp;&amp; x !== null) || (x === &#8220;function&#8221;)<\/li><li>\u67e5\u770b x \u6709\u6ca1\u6709 .then \u5c5e\u6027 (\u89c4\u8303\u4e2d: \u53d6\u51fa x.then \u53ef\u80fd\u4f1a\u53d1\u751f\u5f02\u5e38, \u5982\u679c then \u662f function \u5219\u5c31\u8ba4\u5b9a\u4ed6\u662f promise)<\/li><\/ul><\/li><li>\u5982\u679c x \u662f promise \u5219\u76d1\u542c\u62a5\u9519<ul><li>try \u4f18\u5316, \u9632\u6b62 x.then \u7684\u8fd4\u56de\u662f\u540c\u4e00\u4e2a promise, \u5fc5\u987b\u8c03\u7528 resolvePromise<\/li><li>\u9632\u6b62\u591a\u4e00\u6b21\u8c03\u7528\u591a\u4e2a\u72b6\u6001, \u52a0\u5165 called \u8ba4\u8bc1, \u53ea\u8981\u901a\u8fc7\u4e00\u4e2a\u72b6\u6001,\u8fd9\u4e2a\u503c\u5c31\u4f1a\u8ba4\u4e3a true<\/li><\/ul><\/li><\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>function resolvePromise (promise2,x,resolve,reject){<br> &nbsp; &nbsp;\/\/ \u5224\u65ad x \u548c promise \u4e0d\u80fd\u5f15\u5165\u540c\u4e00\u4e2a promise \u5bf9\u8c61<br> &nbsp; &nbsp;if(promise2 === x){reject(new TypeError(\"chaining cycle detected for promise\"))}<br> &nbsp; &nbsp;\/\/ \u5224\u65ad x \u662f\u4e0d\u662f promise \u5bf9\u8c61<br> &nbsp; &nbsp;if((typeof x === \"object\" &amp;&amp; x !== null) || (typeof x === \"function\")){<br> &nbsp; &nbsp; &nbsp; &nbsp;let called = false; \/\/ \u9632\u6b62\u51fa\u73b0\u4e00\u4e2a\u56de\u8c03\u6267\u884c\u591a\u4e2a\u72b6\u6001<br> &nbsp; &nbsp; &nbsp; &nbsp;try{<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;let then = x.then;<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if(typeof then === \"function\"){<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;then.call(<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;      x,<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  (y)=&gt;{<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  if(called){return}<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;called = true;<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;resolvePromise(promise2,y,resolve,reject)<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  },<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  (err)=&gt;{<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if(called){return}<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;called = true;<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;reject(err)<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  }<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  )<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  }else{<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;resolve(x)<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  }<br> &nbsp; &nbsp; &nbsp;  }catch(err){<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if(called){return}<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;called = true;<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;reject(err)<br> &nbsp; &nbsp; &nbsp;  }<br> &nbsp;  }else{<br> &nbsp; &nbsp; &nbsp; &nbsp;resolve(x)<br> &nbsp;  }<br>}<br>\u200b<br>class promise {<br> &nbsp; &nbsp;....<br> &nbsp; &nbsp;then(onFulfilled,onRejected){ \/\/ \u63a5\u6536\u4e00\u4e2a\u6210\u529f , \u5931\u8d25\u7684\u56de\u8c03<br> &nbsp; &nbsp; &nbsp; &nbsp;let promise2 = new Promise((resolve,reject)=&gt;{ <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if(this.state === FULFILLED){ \/\/ \u5982\u679c\u5403\u6210\u529f\u72b6\u6001,\u5219\u8c03\u7528resolve<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;try{<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;let x = onFulfilled(this.value)<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;resolvePromise(promise2,x,resolve,reject)<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  }catch(error){<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;    reject(error)<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  }<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  }<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if(this.state === REJECTED){ \/\/ \u5982\u679c\u662f\u5931\u8d25\u72b6\u6001,\u5219\u8c03\u7528reject<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;try{<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;let x = onRejected(this.reason)<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;resolvePromise(promise2,x,resolve,reject)<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  }catch(error){<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;reject(error)<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  }<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  }<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if(this.state === PENDING){<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;this.onFulfilledCallbacks.push(()=&gt;{ \/\/ \u5f02\u6b65\u7684\u6210\u529f\u56de\u8c03<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;try{<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;let x = onFulfilled(this.value)<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;          resolvePromise(promise2,x,resolve,reject)<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  }catch(error){<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  reject(error) <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  }<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  })<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;this.onRejectedCallbacks,push(()=&gt;{ \/\/ \u5f02\u6b65\u7684\u5931\u8d25\u56de\u8c03<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;try{<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;let x = onFulfilled(this.value)<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;          resolvePromise(promise2,x,resolve,reject)<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  }catch(error){<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;    reject(error) &nbsp; <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  }<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  })<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  }<br> &nbsp; &nbsp; &nbsp;  })<br> &nbsp;  }<br>}<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"then-\u7684\u4f18\u5316\">then \u7684\u4f18\u5316<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>class Promise{<br> &nbsp; &nbsp;...<br> &nbsp; &nbsp;then(onFulfilled,onRejected){<br> &nbsp; &nbsp; &nbsp; &nbsp;onFulilled = typeof onFulfilled === \"function\"?onFulflled : v=&gt;v;<br> &nbsp; &nbsp; &nbsp; &nbsp;onRejected = typeof onRejected === \"function\"? onRejected : e=&gt;{throw e}<br> &nbsp;  }<br>}<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"\u5e38\u7528api\u5b9e\u73b0\">\u5e38\u7528API\u5b9e\u73b0<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"promise-catch\">promise.catch<\/h3>\n\n\n\n<p>\u5931\u8d25\u7684\u56de\u8c03<\/p>\n\n\n\n<p>\u7528\u6cd5<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>let xxx = new Promise((resolve,reject)=&gt;{})<br>xxx.then(()=&gt;{}).catch(()=&gt;{})<\/code><\/pre>\n\n\n\n<p>\u5b9e\u73b0<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class Promise{<br> &nbsp; &nbsp;...<br> &nbsp; &nbsp;static catch = function (errCallback){<br> &nbsp; &nbsp; &nbsp; &nbsp;return this.then(null,errCallback)<br> &nbsp;  }<br>}<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"promise-resolve\">promise.resolve<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>class Promise {<br> &nbsp; &nbsp;constructor(exectuor){<br> &nbsp; &nbsp; &nbsp; &nbsp;...<br> &nbsp; &nbsp; &nbsp; &nbsp;const resolve = (value)=&gt;{<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; \/\/ \u5224\u65advalue\u662f\u4e0d\u662f promise ,\u5982\u679c\u662f\u76f4\u63a5\u8fd4\u56dethen\u7684\u7ed3\u679c<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(value === Promise){<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return value.then(resolve,reject)<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;...<br> &nbsp; &nbsp; &nbsp;  }<br> &nbsp; &nbsp; &nbsp; &nbsp;...<br> &nbsp;  }<br> &nbsp; &nbsp;static resolve= function(value){<br> &nbsp; &nbsp; &nbsp; &nbsp;return new Promise((resolve,reject)=&gt;{<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;resolve(value)<br> &nbsp; &nbsp; &nbsp;  })<br> &nbsp;  }<br>}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"promise-reject\">promise.reject<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>class Promise{<br> &nbsp; &nbsp;static reject = function(reason){<br> &nbsp; &nbsp; &nbsp; &nbsp;return new Promise((resolve,reject)=&gt;{<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;reject(reason)<br> &nbsp; &nbsp; &nbsp;  })<br> &nbsp;  }<br>}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"promise-call\">promise.call<\/h3>\n\n\n\n<p>\u53ea\u6709\u5168\u90e8\u6210\u529f\u624d\u4f1a\u6210\u529f<\/p>\n\n\n\n<p>\u7528\u6cd5<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>new Promise.call(&#91;promise1,promise2]).then(()=&gt;{},()=&gt;{})<\/code><\/pre>\n\n\n\n<p>\u5b9e\u73b0<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class Promise{<br> &nbsp; &nbsp;static all(values){<br> &nbsp; &nbsp; &nbsp; &nbsp;return new Promise((resolve,reject)=&gt;{<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  let arr = &#91;];<br> &nbsp; &nbsp; &nbsp;      let times = 0;<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;function processData(index,data){<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;arr&#91;index] = data;<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if(++times === values.length){<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;resolve(arr)<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  }<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  }<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;values.forEach((item,index)=&gt;{<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Promise.resolve(item).then(()=&gt;{<br>                    processDate(index,data) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  })<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  })<br> &nbsp; &nbsp; &nbsp;  })<br> &nbsp;  }<br>}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"promise-race\">promise.race<\/h3>\n\n\n\n<p>\u6709\u4e00\u4e2a\u6210\u529f\u5c31\u7b97\u6210\u529f<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class Promise{<br> &nbsp; &nbsp;static race = function(values){<br> &nbsp; &nbsp; &nbsp; &nbsp;return new Promise((resolve,reject)=&gt;{<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;values.forEach((item)=&gt;{<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Promise.resolve(item).then(resolve,reject)<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  })<br> &nbsp; &nbsp; &nbsp;  })<br> &nbsp;  }<br>}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>promise \u57fa\u672c\u6982\u5ff5 promise \u662f\u4e00\u4e2a\u6784\u9020\u51fd\u6570, \u5fc5\u987b\u4f20\u4e00\u4e2a executor \u6267\u884c\u5668 execut [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-488","post","type-post","status-publish","format-standard","hentry","category-javascript"],"_links":{"self":[{"href":"https:\/\/gjweb.top\/index.php?rest_route=\/wp\/v2\/posts\/488","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gjweb.top\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gjweb.top\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gjweb.top\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gjweb.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=488"}],"version-history":[{"count":1,"href":"https:\/\/gjweb.top\/index.php?rest_route=\/wp\/v2\/posts\/488\/revisions"}],"predecessor-version":[{"id":489,"href":"https:\/\/gjweb.top\/index.php?rest_route=\/wp\/v2\/posts\/488\/revisions\/489"}],"wp:attachment":[{"href":"https:\/\/gjweb.top\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=488"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gjweb.top\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=488"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gjweb.top\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=488"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}