diff options
Diffstat (limited to 'files/zh-cn/web/javascript/reference/global_objects/promise/any/index.html')
-rw-r--r-- | files/zh-cn/web/javascript/reference/global_objects/promise/any/index.html | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/files/zh-cn/web/javascript/reference/global_objects/promise/any/index.html b/files/zh-cn/web/javascript/reference/global_objects/promise/any/index.html new file mode 100644 index 0000000000..25e87a91af --- /dev/null +++ b/files/zh-cn/web/javascript/reference/global_objects/promise/any/index.html @@ -0,0 +1,153 @@ +--- +title: Promise.any() +slug: Web/JavaScript/Reference/Global_Objects/Promise/any +tags: + - Experimental + - JavaScript + - Method + - Promise + - Reference +translation_of: Web/JavaScript/Reference/Global_Objects/Promise/any +--- +<p>{{JSRef}}</p> + +<p><code>Promise.any()</code> 接收一个{{JSxRef("Promise")}}可迭代对象,只要其中的一个 <code>promise</code> 成功,就返回那个已经成功的 <code>promise</code> 。如果可迭代对象中没有一个 <code>promise</code> 成功(即所有的 <code>promises</code> 都失败/拒绝),就返回一个失败的 <code>promise </code>和{{JSxRef("Global_Objects/AggregateError", "AggregateError")}}类型的实例,它是 {{JSxRef("Error")}} 的一个子类,用于把单一的错误集合在一起。本质上,这个方法和{{JSxRef("Promise.all()")}}是相反的。</p> + +<div class="blockIndicator warning"> +<p><strong>注意!</strong> <code>Promise.any()</code> 方法依然是实验性的,尚未被所有的浏览器完全支持。它当前处于 <a href="https://github.com/tc39/proposal-promise-any">TC39 第四阶段草案(Stage 4)</a></p> +</div> + +<h2 id="语法">语法</h2> + +<pre class="notranslate">Promise.any(<var>iterable</var>);</pre> + +<h3 id="参数">参数</h3> + +<dl> + <dt><code>iterable</code></dt> + <dd>一个<a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Iteration_protocols#The_iterable_protocol">可迭代</a>的对象, 例如 <a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array">Array</a>。</dd> +</dl> + +<h3 id="返回值">返回值</h3> + +<ul> + <li>如果传入的参数是一个空的可迭代对象,则返回一个 <strong>已失败(already rejected)</strong> 状态的 <a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise">Promise</a>。</li> + <li>如果传入的参数不包含任何 <code>promise</code><var>,则返回</var>一个 <strong>异步完成</strong> (<strong>asynchronously resolved</strong>)的 <a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise">Promise</a>。</li> + <li>其他情况下都会返回一个<strong>处理中(pending)</strong> 的 <a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise">Promise</a>。 只要传入的迭代对象中的任何一个 <code>promise</code> 变成成功(resolve)状态,或者其中的所有的 <code>promises</code> 都失败,那么返回的 <code>promise</code> 就会 <strong>异步地</strong>(当调用栈为空时)<strong> </strong>变成成功/失败(resolved/reject)状态。</li> +</ul> + +<h2 id="说明">说明</h2> + +<p>这个方法用于返回第一个成功的 <code>promise</code> 。只要有一个 <code>promise</code> 成功此方法就会终止,它不会等待其他的 <code>promise</code> 全部完成。</p> + +<p>不像 <a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise/all">Promise.all()</a> 会返回一组完成值那样(resolved values),我们只能得到一个成功值(假设至少有一个 <code>promise</code> 完成)。当我们只需要一个 <code>promise</code> 成功,而不关心是哪一个成功时此方法很有用的。</p> + +<p>同时, 也不像 <a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise/race">Promise.race()</a> 总是返回第一个结果值(resolved/reject)那样,这个方法返回的是第一个<em> 成功的</em> 值。这个方法将会忽略掉所有被拒绝的 <code>promise</code>,直到第一个 <code>promise</code> 成功。</p> + +<h3 id="成功(Fulfillment):">成功(Fulfillment):</h3> + +<p>当任何一个被传入的 <code>promise</code> 成功的时候, 无论其他的 <code>promises</code> 成功还是失败,此函数会将那个成功的 <code>promise</code> 作为返回值 。</p> + +<ul> + <li>如果传入的参数是一个空的可迭代对象, 这个方法将会同步返回一个已经完成的 <code>promise</code>。</li> + <li>如果传入的任何一个 <code>promise</code> 已成功, 或者传入的参数不包括任何 <code>promise</code>, 那么 <code>Promise.any</code> 返回一个异步成功的 <code>promise</code>。</li> +</ul> + +<h3 id="失败拒绝(Rejection):">失败/拒绝(Rejection):</h3> + +<p>如果所有传入的 <code>promises</code> 都失败, <code>Promise.any</code> 将返回异步失败,和一个 <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/AggregateError">AggregateError</a> 对象,它继承自 <a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Error">Error</a>,有一个 <code>error</code> 属性,属性值是由所有失败值填充的数组。</p> + +<h2 id="示例">示例</h2> + +<h3 id="First_to_fulfil">First to fulfil</h3> + +<p>即使第一个返回的 promise 是失败的,<code>Promise.any()</code> 依然使用第一个成功状态的 promise 来返回。这与使用首个(无论 rejected 还是 fullfiled)promise 来返回的 {{jsxref("Promise.race()")}} 相反。</p> + +<pre class="brush: js notranslate">const pErr = new Promise((resolve, reject) => { + reject("总是失败"); +}); + +const pSlow = new Promise((resolve, reject) => { + setTimeout(resolve, 500, "最终完成"); +}); + +const pFast = new Promise((resolve, reject) => { + setTimeout(resolve, 100, "很快完成"); +}); + +Promise.any([pErr, pSlow, pFast]).then((value) => { + console.log(value); + // pFast fulfils first +}) +// 期望输出: "很快完成" +</pre> + +<h3 id="Rejections_with_AggregateError">Rejections with AggregateError</h3> + +<p>如果没有 fulfilled (成功的) promise,<code>Promise.any()</code> 返回 {{jsxref("AggregateError")}} 错误。</p> + +<pre class="brush: js notranslate">const pErr = new Promise((resolve, reject) => { + reject('总是失败'); +}); + +Promise.any([pErr]).catch((err) => { + console.log(err); +}) +// 期望输出: "AggregateError: No Promise in Promise.any was resolved" +</pre> + +<h3 id="显示第一张已加载的图片">显示第一张已加载的图片</h3> + +<p>在这个例子,我们有一个获取图片并返回 blob 的函数,我们使用 <code>Promise.any()</code> 来获取一些图片并显示第一张有效的图片(即最先 resolved 的那个 promise)。</p> + +<pre class="brush: js notranslate">function fetchAndDecode(url) { + return fetch(url).then(response => { + if(!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } else { + return response.blob(); + } + }) +} + +let coffee = fetchAndDecode('coffee.jpg'); +let tea = fetchAndDecode('tea.jpg'); + +Promise.any([coffee, tea]).then(value => { + let objectURL = URL.createObjectURL(value); + let image = document.createElement('img'); + image.src = objectURL; + document.body.appendChild(image); +}) +.catch(e => { + console.log(e.message); +});</pre> + +<h2 id="规范">规范</h2> + +<table class="standard-table"> + <thead> + <tr> + <th scope="col">规范</th> + </tr> + </thead> + <tbody> + <tr> + <td>{{SpecName('Promise.any')}}</td> + </tr> + </tbody> +</table> + +<h2 id="浏览器兼容性">浏览器兼容性</h2> + + + +<p>{{Compat("javascript.builtins.Promise.any")}}</p> + +<h2 id="参见">参见</h2> + +<ul> + <li>{{JSxRef("Promise")}}</li> + <li>{{JSxRef("Promise.all()")}}</li> + <li>{{JSxRef("Promise.race()")}}</li> +</ul> |