ES2018-最终承诺方法

该说明的作者(我们今天将其翻译成该版本的译本)说,他几乎没有避免不称其为“最后-每个人都在等待的机会”,或者以某种方式在开玩笑说这个话题。 最后,他决定不开玩笑,只谈论Promise对象的真正重要和有用的功能。


如果您刚刚开始学习JavaScript并且对promise不太熟悉(有时将它们称为“ promise”,“ promise results”,“ Promise对象”),那么您可能会对我们以前有关此主题的出版物感兴趣:

ES6中的承诺:模式和反模式
JavaScript:异步编程方法
JavaScript ES8并过渡到异步/等待
异步/等待:忘记承诺的6个理由
逃离地狱异步/等待
JavaScript ES6:编写更少-做更多
承诺指南,供那些想要整理的人参考
JavaScript异步/等待设计:优势,缺陷和使用模式
在JavaScript中使用Promises

Promise.prototype.finally方法


ECMAScript 2018标准的第25.6.5.3条专用于Promise.prototype.finally方法 ,根据caniuse.com ,此方法的支持级别约为81%。 此方法也可以在Node.js中使用。

finally承诺方法是该标准最重要的创新之一,它使您可以指定将执行的功能,而与承诺的结果无关。 如果成功解决了诺言,并且拒绝了诺言,则将履行该职能。
考虑一个例子:

 const myPromise = new Promise((resolve, reject) => { setTimeout(() => { resolve('success!!!'); }, 2000); }); 

这是一个完全常见的承诺,在2000毫秒后解决。 如果在那之后我们需要执行一些操作,我们将需要一个then块:

 myPromise.then( result => { console.log(result) }, failMessage => { console.log(failMessage) } ); 

两个匿名函数被传递给then方法。 如果成功解决了诺言,则将执行第一个。 第二个是当它被拒绝时。 我们的承诺将始终success!!!完成, success!!!消息将始终显示在控制台中success!!! 。 所有这些都很好,但是如果在拒绝诺言之后以及成功完成诺言之后有必要采取某些行动呢? 在这里, finally方法将帮助我们:

 const myPromise = new Promise((resolve, reject) => { setTimeout(() => { resolve('success!!!'); }, 2000); }); myPromise.then( result => { console.log(result) }, failMessage => { console.log(failMessage) } ).finally(finallyMessage => { console.log('FINALLY!!')}); 

无论promise如何完成其​​工作,除了相应的消息外,文本FINALLY!! ,这告诉我们传递给finally方法的回调函数仍然有效。 为了验证这一点,您可以尝试一下。

总结


Promise.prototype.finally方法出现在ES2018中的事实表明,在可预见的将来,我们可以期望对浏览器的支持非常高。 这意味着您以前必须使用由第三方开发人员创建的辅助工具,现在可以使用标准工具来实现。

在什么情况下Promise.prototype.finally方法可以派上用场? 例如-如果在启动用于下载内容的Promise时开始播放某些动画,那么finally可以完成此动画。 在finally块中,例如,您可以关闭某个模式窗口。 实际上,在许多情况下, finally方法可能会有用。

亲爱的读者们! 在标准实现之前,您是否使用了finally promise方法的替代品?

Source: https://habr.com/ru/post/zh-CN427405/


All Articles