概述

所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。

语法

new Promise(executor);
new Promise(function(resolve, reject) { ... });

参数

executor
带有 resolve 、reject两个参数的一个函数。这个函数在创建Promise对象的时候会立即得到执行(在Promise构造函数返回Promise对象之前就会被执行),并把成功回调函数(resolve)和失败回调函数(reject)作为参数传递进来。调用成功回调函数(resolve)和失败回调函数(reject)会分别触发promise的成功或失败。这个函数通常被用来执行一些异步操作,操作完成以后可以选择调用成功回调函数(resolve)来触发promise的成功状态,或者,在出现错误的时候调用失败回调函数(reject)来触发promise的失败。

描述

Promise 对象是一个返回值的代理,这个返回值在promise对象创建时未必已知。它允许你为异步操作的成功返回值或失败信息指定处理方法。 这使得异步方法可以像同步方法那样返回值:异步方法会返回一个包含了原返回值的 promise 对象来替代原返回值。

Promise对象有以下几种状态:

  • pending: 初始状态, 既不是 fulfilled 也不是 rejected.
  • fulfilled: 成功的操作.
  • rejected: 失败的操作.

pending状态的promise对象既可转换为带着一个成功值的fulfilled 状态,也可变为带着一个失败信息的 rejected 状态。当状态发生转换时,promise.then绑定的方法(函数句柄)就会被调用。(当绑定方法时,如果 promise对象已经处于 fulfilled 或 rejected 状态,那么相应的方法将会被立刻调用, 所以在异步操作的完成情况和它的绑定方法之间不存在竞争条件。)

因为Promise.prototype.then和 Promise.prototype.catch方法返回 promises对象, 所以它们可以被链式调用—— 一种被称为 composition 的操作。

示例

创建Promise

这个小例子展示了Promise的机制。每当<button>被按下时,testPromise() 函数就会被执行。该函数会创建一个用window.setTimeout在1到3秒(随机)后用‘result’字符串完成的promise。

这里通过p1.then方法的满足回调,简单的输出了promise的满足过程,这些输出显示了该方法的同步部分是如何和promise的异步完成解耦的。

<!--标注:下面略微修改了英文版的示例,主要是执行3次testPromise()的效果,如果您有疑问,可以参看英文的说明文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise-->
<div id="log"></div>
<script>'use strict';var promiseCount = 0;function testPromise() {var thisPromiseCount = ++promiseCount;var log = document.getElementById('log');log.insertAdjacentHTML('beforeend', thisPromiseCount + ') 开始(同步代码开始)<br/>');// 我们创建一个新的promise: 然后用'result'字符串完成这个promise (3秒后)var p1 = new Promise(function (resolve, reject) {// 完成函数带着完成(resolve)或拒绝(reject)promise的能力被执行log.insertAdjacentHTML('beforeend', thisPromiseCount + ') Promise开始(异步代码开始)<br/>');// 这只是个创建异步完成的示例window.setTimeout(function () {// 我们满足(fullfil)了这个promise!
                resolve(thisPromiseCount)}, Math.random() * 2000 + 1000);});// 定义当promise被满足时应做什么p1.then(function (val) {// 输出一段信息和一个值log.insertAdjacentHTML('beforeend', val + ') Promise被满足了(异步代码结束)<br/>');});log.insertAdjacentHTML('beforeend', thisPromiseCount + ') 建立了Promise(同步代码结束)<br/><br/>');}
</script>

这个例子在按钮被按下后执行。你需要一个支持Promise的浏览器。你能通过短时间内按多次按钮看到不同的promise一个接一个的被完成。

转自:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise

转载于:https://www.cnblogs.com/bonelee/p/6102356.html

javascript primise本质——为了简化异步编码而针对异步操作的代理相关推荐

  1. Reactive框架:简化异步及事件驱动编程

    NET的Reactive Extensions包含一系列扩展方法和为.NET 4及Silverlight 4中新加入的 IObservable<out T> 和 IObserver< ...

  2. 第十节:利用async和await简化异步编程模式的几种写法

    一. async和await简介 PS:简介 1. async和await这两个关键字是为了简化异步编程模型而诞生的,使的异步编程更简洁,它本身并不创建新线程,但在该方法内部开启多线程,则另算. 2. ...

  3. jQuery是一个JavaScript库极大的简化JavaScript编程

    jQuery是一个JavaScript库极大的简化JavaScript编程 1.jQuery 库包含以下特性: HTML 元素选取 HTML 元素操作 CSS 操作 HTML 事件函数 JavaScr ...

  4. javascript用btoa和atob来编码解码Base64

    javascript用btoa和atob来编码解码Base64 btoa和atob是window对象的两个函数,其中btoa是binary to ascii,用于将binary的数据用ascii码表示 ...

  5. 平均数编码:针对高基数定性特征(类别特征)的数据预处理/特征工程

    https://zhuanlan.zhihu.com/p/26308272 (在另一篇文章中,我正在汇总所有已知的数据挖掘特征工程技巧:[持续更新]机器学习特征工程实用技巧大全 - 知乎专栏.) 前言 ...

  6. 轻量函数式 JavaScript:十、函数式异步

    这本书读到这里,你现在拥有了所有 FP -- 我称之为 "轻量函数式编程" -- 基础的原始概念.在这一章中,我们会将这些概念应用于一种不同的环境,但不会出现特别的新想法. 至此, ...

  7. 用Async函数简化异步代码

    Promise 在 JavaScript 上发布之初就在互联网上流行了起来 - 它们帮开发人员摆脱了回调地狱,解决了在很多地方困扰 JavaScript 开发者的异步问题.但 Promises 也远非 ...

  8. Async和Await如何简化异步编程几个实例

    引言 C#5.0中async和await两个关键字,这两个关键字简化了异步编程,之所以简化了,还是因为编译器给我们做了更多的工作,下面就具体看看编译器到底在背后帮我们做了哪些复杂的工作的. 同步代码存 ...

  9. javascript的回调函数 同步 异步

    后一个任务等待前一个任务结束再执行.程序执行顺序与任务排列顺序一致的,同步的. 参考: http://www.ruanyifeng.com/blog/2012/12/asynchronous%EF%B ...

最新文章

  1. Android客户端捕获http请求包的方法
  2. 连接SQLite 创建ADO.net实体类
  3. nginx总结二(nginx的启动停止以及版本平滑升级)
  4. Python中的条件语句和循环语句
  5. VC6.0蕉HOOK_timeGetTime 达到变速效果
  6. vue将原生事件绑定到组件
  7. CharNet算法详解
  8. java jsp 传递参数的方法,jsp传参方法小结
  9. Moonlight 2紧随Silverlight而来
  10. 电脑功耗测试软件_电脑“烤机”怎么测?用这几款软件就对了
  11. SQL SERVER游标浅析
  12. D.579 - ClockHands
  13. 人人商城小程序服务器根目录,微擎通用-人人商城v3小程序安装步骤小程序配置说明...
  14. 电子科学与技术毕业论文题目【452个】
  15. linux查看nginx昅 电视,PHP实现查询汉字笔画、笔画排序、笔画统计
  16. 苹果要创新,IPhone是累赘
  17. 你很牛,且是刚毕业的,那就到华为上班吧!--绝对隐私:华为员工待遇全面揭秘
  18. Angular:失焦校验和失焦方法冲突的解决方案 事件循环
  19. 2021东三省数学建模竞赛a题
  20. java蓝桥杯练习 幸运数

热门文章

  1. oracle指定用户SID,如何修改oracle SID
  2. python文本替换 数据库_Python pptx(Power Point)查找和替换文本(ctrl+H)
  3. 大工18秋《c c 语言程序设计》,大工18秋《毕业论文(设计)写作指导》在线测试1.txt...
  4. vue build text html,Vue中v-text / v-HTML使用实例代码详解_放手_前端开发者
  5. 【深度学习入门到精通系列】拿捏Dice系数
  6. 【Web安全】DVWA之Command injection(命令执行漏洞)探索
  7. 算法训练 区间k大数查询
  8. java getqueue 0_【求助】Exception in threadAWT-EventQueue-0java.lang.Null
  9. xshell导出文件用ftp到本地_使用xshell从远程服务器下载文件到本地
  10. python不能加密_Python之加密模块