JavaScript 的 Promise 是其最受赞誉的功能之一。在语言中直接内置原生异步构件,开启了一个新时代,不仅改变了我们的编码方式,也为其他强大的 API(如 fetch!)奠定了基础。
让我们回顾一下 Promise 初次发布时获得的功能,以及接下来将获得哪些新功能。
不了解 Promise 的概念?我强烈推荐 Jake Archibald 的文章作为入门介绍。
现有功能
让我们快速浏览一下目前可以使用 Promise 执行的操作。JavaScript 引入 Promise 后,提供了一个 API 来执行异步操作并对它们的成功返回或失败做出反应,一种围绕某些数据或结果创建关联的方法,而这些数据的或结果的值我们仍然不知道。
以下是我们目前拥有的 Promise 功能。
处理 Promise
每当异步方法返回一个 Promise(例如使用 fetch 时),我们都可以使用 then()
在 Promise fulfilled(已完成)时执行操作,并使用 catch()
来响应 Promise rejected(已拒绝)。
fetch('//resource.to/some/data') .then(result => console.log('我们得到了它', result.json())) .catch(error => console.error('出现错误', error))
经典用例是从 API 调用数据,并在数据返回时加载数据,或者如果找不到数据则显示错误消息。
此外,在其初始版本中,我们获得了两种处理 Promise 组的方法。
解析和拒绝 Promise 集合
当 Promise 成功解析时,它可以被 fulfilled;当它以错误解析时,它可以被 rejected;当没有解析时,它处于 pending 状态。当 Promise 已解析时,无论结果如何,它都被认为是已完成的。
因此,我们有两种方法可以帮助处理 Promise 组的行为,具体取决于我们获得的状态组合。
Promise.all
就是其中一种方法。只有当所有 Promise 都成功解析时,它才会 fulfilled,并返回一个包含每个 Promise 结果的数组。如果其中一个 Promise 失败,Promise.all
将进入 catch
并返回错误原因。
Promise.all([ fetch('//resource.to/some/data'), fetch('//resource.to/more/data') ]) .then(results => console.log('我们得到一个结果数组', results)) .catch(error => console.error('其中一个 Promise 失败了', error))
在这种情况下,一旦集合的成员之一抛出错误,Promise.all
将短路并进入 catch
,或者当所有 Promise 都 fulfilled 时完成。
查看 Domenic Denicola 关于 Promise 状态的简短文章,以更详细地了解其措辞和概念。
我们还有 Promise.race
,它会立即解析为它获得的第一个 Promise,无论它是 fulfilled 还是 rejected。第一个 Promise 解析后,其余 Promise 将被忽略。
Promise.race([ fetch('//resource.to/some/data'), fetch('//resource.to/other/data') ]) .then(result => console.log('第一个 Promise 已解析', result)) .catch(reason => console.error('其中一个 Promise 失败了,因为', reason))
新功能
好的,我们将把注意力转向我们可以期待的新 Promise 功能。
Promise.allSettled
下一个提议添加到 Promise 家族的是 Promise.allSettled
,顾名思义,它只有在数组中的所有集合成员不再处于 pending 状态时才会继续执行,无论它们是 rejected 还是 fulfilled。
Promise.allSettled([ fetch('//resource.to/some/data'), fetch('//resource.to/more/data'), fetch('//resource.to/even/more/data') ]) .then(results => { const fulfilled = results.filter(r => r.status === 'fulfilled') const rejected = results.filter(r => r.status === 'rejected') })
请注意,这与 Promise.all
不同,因为我们永远不会进入 catch
语句。如果我们正在等待将进入 Web 应用程序不同部分的数据集,但希望为每个结果提供更具体的邮件或执行不同的操作,这非常好。
Promise.any
下一个新方法是 Promise.any
,它允许我们对集合中的任何 fulfilled Promise 做出反应,但只有在所有 Promise 都失败时才会短路。
Promise.any([ fetch('//resource.to/some/data'), fetch('//resource.to/more/data'), fetch('//resource.to/even/more/data') ]) .then(result => console.log('一批数据已到达', result)) .catch(() => console.error('所有 Promise 都失败了'))
这有点像 Promise.race
,除了 Promise.race
在第一次解析时短路。因此,如果集合中的第一个 Promise 以错误解析,Promise.race
将继续执行。Promise.any
将继续等待数组中其余项目解析,然后再继续执行。
演示
其中一些使用可视化更容易理解,因此我创建了一个小型游乐场,展示了新方法和现有方法之间的区别。(此处省略演示部分,因为原文未提供具体代码或链接)
总结
虽然它们仍处于提案阶段,但社区脚本可以模拟本文中介绍的新方法。例如 Bluebird 的 any
和 reflect
是我们在等待浏览器支持改进时的良好 polyfill。
它们还展示了社区如何已经使用这种异步模式,但是将它们内置到语言中将为 Web 应用程序中的数据获取和异步解析打开新的可能性。
除了 then
和 catch
之外,您还可以将 finally
传递给 Promise,Sarah Drasner 撰写了一篇关于它的详细文章,您可以查看。(此处省略链接)
如果您想了解即将推出的 Promise 组合器,V8 博客刚刚发布了一个简短的解释,其中包含指向官方规范和提案的链接。(此处省略链接)
以上是窥视新方法的诺言的详细内容。更多信息请关注PHP中文网其他相关文章!

具有CSS的自定义光标很棒,但是我们可以将JavaScript提升到一个新的水平。使用JavaScript,我们可以在光标状态之间过渡,将动态文本放置在光标中,应用复杂的动画并应用过滤器。

互动CSS动画和元素相互启动的元素在2025年似乎更合理。虽然不需要在CSS中实施乒乓球,但CSS的灵活性和力量的增加,可以怀疑Lee&Aver Lee&Aver Lee有一天将是一场

有关利用CSS背景滤波器属性来样式用户界面的提示和技巧。您将学习如何在多个元素之间进行背景过滤器,并将它们与其他CSS图形效果集成在一起以创建精心设计的设计。

好吧,事实证明,SVG的内置动画功能从未按计划进行弃用。当然,CSS和JavaScript具有承载负载的能力,但是很高兴知道Smil并没有像以前那样死在水中

是的,让#039;跳上文字包装:Safari Technology Preview In Pretty Landing!但是请注意,它与在铬浏览器中的工作方式不同。

此CSS-tricks更新了,重点介绍了年鉴,最近的播客出现,新的CSS计数器指南以及增加了几位新作者,这些新作者贡献了有价值的内容。

在大多数情况下,人们展示了@Apply的@Apply功能,其中包括Tailwind的单个property实用程序之一(会改变单个CSS声明)。当以这种方式展示时,@Apply听起来似乎很有希望。如此明显


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

Atom编辑器mac版下载
最流行的的开源编辑器

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3 英文版
推荐:为Win版本,支持代码提示!