Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。

所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。

(1)对象的状态不受外界影响。Promise 对象代表一个异步操作,有三种状态:pending(进行中)、fulfilled(已成功)和 rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是 Promise 这个名字的由来,它的英语意思就是“承诺”,表示其他手段无法改变。

(2)一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可能:从 pending 变为 fulfilled 和从 pending 变为 rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果,这时就称为 resolved(已定型)。如果改变已经发生了,你再对 Promise 对象添加回调函数,也会立即得到这个结果。这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。

Promise 也有一些缺点。首先,无法取消 Promise,一旦新建它就会立即执行,无法中途取消。

Promise 不能被取消,真的算是它的缺点吗?

其实还好,多数情况下,我们要取消的不是 Promise,而是生成 Promise 的那个任务。

而且这个任务本身的取消,有时还附带清理现场的需求,比方说,我 await 了一个存储文件的任务,那么取消这个存储文件任务,意味着中断文件写入,把已经写入的一些信息回滚等等操作。单纯从 Promise 的角度取消,其实只是取消了 Promise 后的回调,原本的任务还是执行完成了,若真设计出取消功能,很容易造成误判。

此外,当真正需要取消时,我们完全可以在 await 之后或者 then 的回调中加入控制逻辑,这能够保证代码逻辑紧凑,否则,我们调试时可能面临“ Promise 被取消时到处找取消的代码”这样的窘境。

综上,我认为 Promise 的取消功能不能说完全没用,至少在我看来没什么必要性,甚至不是什么好的实践。不能被取消,更谈不上设计缺点了。

我们多数情况下需要取消语义是为了通过减少无用计算来节约计算资源,所以通常来说这并不是一个太大的问题,它只会白白消耗计算资源,并不会造成错误。而且如果你需要的话,你也可以比较容易地在提供这个 Promise 的地方实现。

无法取消 Promise相关推荐

  1. 【JS】1126- 如何更好的取消一个promise?

    一个正在执行中的promise怎样被取消? 其实就像一个执行中的ajax要被取消一样,ajax有abort()进行取消,而且fetch api 也有了相关的规范-[AbortController]. ...

  2. Javascript 中的神器——Promise

    回调函数真正的问题在于他剥夺了我们使用 return 和 throw 这些关键字的能力.而 Promise 很好地解决了这一切 Promise概念 所谓 Promise,就是ES6原生提供的一个对象, ...

  3. Promise基础用法

    什么是Promise? Promise是用来处理异步的; Promise就是承诺,对未来的承诺; 所谓的Promise(承诺),里面保存着未来才会结束的事件的结果; Promise是异步编程的一种解决 ...

  4. 【ES6】Promise对象详解

    [ES6]Promise对象详解 一.Promise对象的含义 二.Promise对象的用法 三.Promise对象的几个应用[重点] 1.时间延迟函数 2.图片异步加载 查看更多ES6教学文章: 参 ...

  5. NodeJS基础2---2 Promise详解

    2019独角兽企业重金招聘Python工程师标准>>> 一.ES6的Promise语言标准.Promise/A+规范 1.Promise是Js针对异步场景的解决方案. Promise ...

  6. ES6之路第十二篇:Promise对象

    Promise的含义 Promise 是异步编程的一种解决方案,比传统的解决方案--回调函数和事件--更合理和更强大.它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了Prom ...

  7. 漫谈promise使用场景

    深入理解promise 对于现在的前端同学来说你不同promise你都不好意思出门了.对于前端同学来说promise已经成为了我们的必备技能. 那么,下面我们就来说一说promise是什么,它能帮助我 ...

  8. Promise和Async-Await的入门教程

    1. Promise是什么 1.1 理解 抽象表达: Promise 是一门新的技术(ES6 规范) Promise 是 JS 中进行异步编程的新解决方案(旧方案是单纯使用回调函数) 具体表达: 从语 ...

  9. 谈谈我对Promise的理解

    一.Promise是什么? Promise是最早由社区提出和实现的一种解决异步编程的方案,比其他传统的解决方案(回调函数和事件)更合理和更强大. ES6 将其写进了语言标准,统一了用法,原生提供了Pr ...

最新文章

  1. 新书上市 | 《复分析:可视化方法》
  2. QS世界大学学科排名公布,清华22个学科进入世界50强
  3. 2017-2018-2 20179207 《网络攻防技术》第五周作业
  4. 首届世界CSS设计大赛结果揭晓
  5. python django 表单_Django-表单处理
  6. linux nohup不生成日志,linux重定向及nohup不输出的方法
  7. 关系型数据库与NoSQL数据库简述
  8. 探索 Python + HyperLPR 进行车牌识别
  9. CIO:让IT成为企业的一种竞争优势
  10. import MySQLdb UserWarning
  11. Python模块-decimal
  12. layui table 复选框数据_Python操作三大数据库 Mysql
  13. 封装ajax函数支持jsonp,ajax和jsonp复习
  14. 快速利用第三方平台SDK,实现点对点语音通话
  15. 群晖修改docker端口映射
  16. 用 WebGL 探索动画和交互技术(一个学习案例)
  17. CCF计算机职业资格认证考试201312-2试题及答案
  18. 在面试中脱颖而出的流程全解
  19. 实测 CSDN开发助手-Chrome插件
  20. visio绘制立方体

热门文章

  1. 一男子蒙冤入狱10天,竟是 AI 认错了!
  2. Doug Lea 在 J.U.C 包里面写的 BUG 又被网友发现了......
  3. 从啥也不会的小白,如何成为合格的算法工程师?
  4. 台积电9月14日起不向华为供货;315曝光50多款App涉嫌内置SDK窃取隐私;Micronaut 1.3.7发布 | 极客头条...
  5. “编程能力差,90% 输在了数学上!”CTO:多数程序员都是瞎努力!
  6. NB-IoT 连接数过亿,开发者如何抓住新机遇?
  7. 由于区块链的影响,我决定转行!
  8. 百度大脑语音能力引擎论坛定档 11.28,邀你一同解码 AI 语音的奥秘
  9. Uber 提出损失变化分配方法 LCA,揭秘神经网络“黑盒” 60s测试:你是否适合转型人工智能? https://edu.csdn.net/topic/ai30?utm_source=csdn_bw
  10. 反转!物联网火爆,开发技术却遇瓶颈!