stay Node.js Use Promise.prototype.finally

New titanium cloud clothing 2020-11-11 16:40:54
stay node.js node js use


lately Promise.prototype.finally() Reached TC39 In the proposal process 4 Stage , This means that its proposal has been accepted , And it has become ECMAScript Part of the latest draft of the code . It seems , Put it in the Node.js It's just a matter of time .


This article will show you : How to use Promise.prototype.finally() And how to write your own simplification polyfill.



One 、 What is? Promise.prototype.finally()


Suppose you create a new promise:


You can use .then() Function to link promises together .


Please note that , it .then() With two function parameters . The first is onFulfilled(), If it's cashed in promise, Will call . The second is onRejected(), If you refuse promise, Call .


promise Is a state machine that can be in one of the following three states

1. undetermined : Basic operation in progress , but promise Not yet realized or rejected

2. Completed : The basic operation has been successfully completed , also promise Now it has relevance value

3. Refuse : The underlying operation failed for some reason , also promise Now there are related errors


Besides , Cashed or cashed promise go by the name of “ Settled ”.



although .then() It's the core mechanism of the commitment chain , But it's not the only mechanism .promise There is also a .catch() Function is convenient for error handling .


The .catch() Function is .then() Use onRejected Handle the program without using onFulfilled A handy shorthand for the handler :


It's like .catch(), The .finally() Function is a convenient shortcut to .then(). The difference lies in , In cash promise To perform or reject promise when ,.finally() Executive function onFinally.

.finally() At the time of writing , This feature has not been included in any Node.js In the version , but promise.prototype.finally stay npm The module on has polyfill.


The script above will be printed at the same time “ Completed ” and “ Rejected ”, This is because onFinally In the realization of promise The handler is called when , Regardless of promise To realize or reject . However ,onFinally The handler did not receive any parameters , So you can't tell promise Whether it has been cashed or rejected .


The finally() Function returns a promise , So you can be more chained .then(),.catch() and .finally() Call to return value .finally() In return promise To which cash is linked promise. for example , Even if onFinally The handler returns “ bar” , The following script will still print “ foo ”.


Again , Even if it's time to onFinally Function did not trigger any errors , The following script will still print “ foo” .


The above script demonstrates and works with an important detail finally():finally() I won't handle it for you promise rejections.finally() How to deal with it promise rejections It's worth studying more carefully .


Two 、 Error handling


The finally() Function doesn't mean processing promise rejections. in fact , It explicitly throws an error after the function is executed onFinally(). The following script will print the unprocessed promise rejections Warning .


Like the same try/catch/finally, You usually want to .finally() Link after a chain .catch().


however , The finally() The function returns a Promise, So nothing can stop you from .catch()after Then link to .finally(). especially , If your onFinally The handler may be wrong , for example , If send out HTTP request , You should .catch() Add... At the end a To handle any errors that may occur .


3、 ... and 、 A simplified Polyfill


I think the easiest way is to write your own implementation . The .finally() Function is a good choice , Because of the official polyfill Only 45 That's ok , And most of them are not necessary for simple proof of concept .

It's this simple finally()polyfill Test cases that can be solved . The following script should be printed 'foo'5 Time .


The following is a simplified polyfill.


The key idea behind this implementation is onFinally The handler can return promise. If so , Then you need to .then() Cash it promise, And resolve or reject the original promise Goals achieved .

You can explicitly check onFinally Whether the value is returned by the handler Promise. But this time Promise.resolve() This has been done for you , And save you a few if sentence .

So you just need to make sure you track the initial promise Determined value or error , And make sure the returned promise from finally() Implement to the initially resolved value res, Or re throw the initial rejected error err.


Four 、 continue


The Promise.prototype.finally() The function is when writing this article 8 First paragraph 4 Stage TC39 One of the proposals , It means finally()Node.js also 7 Other new core language features .


The finally() The function is 8 One of the most exciting of the new features , Because it is expected to make the cleaning after asynchronous operation Cleaner . for example , Here's the code I'm running in production right now , stay finally() After the function is executed , There is an urgent need to release the lock .


Yes promise Is the chain confused ? asynchronous / Waiting is in Node.js The best way to write a commitment in .Await Handle for you promise rejections, So the untreated promise rejections It disappeared .


My new e-book Mastering Async / Await Designed to make you asynchronously / The basics of waiting and asynchronous / Wait for how to adapt in a few hours JavaScript There is a comprehensive understanding of the ecosystem .


original text :

translate : New titanium cloud clothes Wei Jianmin

本文为[New titanium cloud clothing]所创,转载请带上原文链接,感谢

  1. [front end -- JavaScript] knowledge point (IV) -- memory leakage in the project (I)
  2. This mechanism in JS
  3. Vue 3.0 source code learning 1 --- rendering process of components
  4. Learning the realization of canvas and simple drawing
  5. gin里获取http请求过来的参数
  6. vue3的新特性
  7. Get the parameters from HTTP request in gin
  8. New features of vue3
  9. vue-cli 引入腾讯地图(最新 api,rocketmq原理面试
  10. Vue 学习笔记(3,免费Java高级工程师学习资源
  11. Vue 学习笔记(2,Java编程视频教程
  12. Vue cli introduces Tencent maps (the latest API, rocketmq)
  13. Vue learning notes (3, free Java senior engineer learning resources)
  14. Vue learning notes (2, Java programming video tutorial)
  15. 【Vue】—props属性
  16. 【Vue】—创建组件
  17. [Vue] - props attribute
  18. [Vue] - create component
  19. 浅谈vue响应式原理及发布订阅模式和观察者模式
  20. On Vue responsive principle, publish subscribe mode and observer mode
  21. 浅谈vue响应式原理及发布订阅模式和观察者模式
  22. On Vue responsive principle, publish subscribe mode and observer mode
  23. Xiaobai can understand it. It only takes 4 steps to solve the problem of Vue keep alive cache component
  24. Publish, subscribe and observer of design patterns
  25. Summary of common content added in ES6 + (II)
  26. No.8 Vue element admin learning (III) vuex learning and login method analysis
  27. Write a mini webpack project construction tool
  28. Shopping cart (front-end static page preparation)
  29. Introduction to the fluent platform
  30. Webpack5 cache
  31. The difference between drop-down box select option and datalist
  32. CSS review (III)
  33. Node.js学习笔记【七】
  34. Node.js learning notes [VII]
  35. Vue Router根据后台数据加载不同的组件(思考->实现->不止于实现)
  36. Vue router loads different components according to background data (thinking - & gt; Implementation - & gt; (more than implementation)
  37. 【JQuery框架,Java编程教程视频下载
  38. [jQuery framework, Java programming tutorial video download
  39. Vue Router根据后台数据加载不同的组件(思考->实现->不止于实现)
  40. Vue router loads different components according to background data (thinking - & gt; Implementation - & gt; (more than implementation)
  41. 【Vue,阿里P8大佬亲自教你
  42. 【Vue基础知识总结 5,字节跳动算法工程师面试经验
  43. [Vue, Ali P8 teaches you personally
  44. [Vue basic knowledge summary 5. Interview experience of byte beating Algorithm Engineer
  45. 【问题记录】- 谷歌浏览器 Html生成PDF
  46. [problem record] - PDF generated by Google browser HTML
  47. 【问题记录】- 谷歌浏览器 Html生成PDF
  48. [problem record] - PDF generated by Google browser HTML
  49. 【JavaScript】查漏补缺 —数组中reduce()方法
  50. [JavaScript] leak checking and defect filling - reduce() method in array
  51. 【重识 HTML (3),350道Java面试真题分享
  52. 【重识 HTML (2),Java并发编程必会的多线程你竟然还不会
  53. 【重识 HTML (1),二本Java小菜鸟4面字节跳动被秒成渣渣
  54. [re recognize HTML (3) and share 350 real Java interview questions
  55. [re recognize HTML (2). Multithreading is a must for Java Concurrent Programming. How dare you not
  56. [re recognize HTML (1), two Java rookies' 4-sided bytes beat and become slag in seconds
  57. 【重识 HTML ,nginx面试题阿里
  58. 【重识 HTML (4),ELK原来这么简单
  59. [re recognize HTML, nginx interview questions]
  60. [re recognize HTML (4). Elk is so simple