JavaScript Promise对象
Promise的定义
Promise 是异步编程的一种解决方案,比传统的解决方案回调函数和事件更合理和更强大。它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象。
可以把 Promise 理解成一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。它代表了一个异步操作的最终完成和最终失败。操作成功(resolve),操作失败(reject)。
promise的特点
promis的三中状态:
- 待定(pending): 初始状态,既没有被兑现,也没有被拒绝。
- 已兑现(fulfilled): 意味着操作成功完成。
- 已拒绝(rejected): 意味着操作失败。
对象的状态不受外界的影响
只有异步的操作结果,可以决定其当前是那一种状态,其他任何操作都无法改变这个状态。
一旦状态改变,就不会在变,任何时候只有这个结果
Promise对象的状态改变,只有两种可能:
- 从pending变为fulfilled
- 从pending变为rejected
只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果,这时就称为 resolved(已定型)。如果改变已经发生了,你再对Promise对象添加回调函数,也会立即得到这个结果。
promis的缺点
- 首先,无法取消Promise,一旦新建它就会立即执行,无法中途取消。
- 其次,如果不设置回调函数,Promise内部抛出的错误,不会反应到外部。
- 第三,当处于pending状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)
创建Promise
promis对象是由关键字 new 及其构造函数来创建的。
var promise = new Promise(function(resolve, reject) {// 进行异步操作,最终会调用下面两者之一:// resolve(someValue); // fulfilled// reject("failure reason"); // rejected
});
Promise 构造函数包含一个参数和一个带有 resolve(解析)和 reject(拒绝)两个参数的回调。在回调中执行一些操作(例如异步),如果一切都正常,则调用 resolve,否则调用 reject。
实例:
let myFirstPromise = new Promise(function(resolve, reject){//当异步代码执行成功时,我们才会调用resolve(...), 当异步代码失败时就会调用reject(...)//在本例中,我们使用setTimeout(...)来模拟异步代码,实际编码时可能是XHR请求或是HTML5的一些API方法.setTimeout(function(){resolve("成功!"); //代码正常执行!}, 250);
});myFirstPromise.then(function(successMessage){//successMessage的值是上面调用resolve(...)方法传入的值.//successMessage参数不一定非要是字符串类型,这里只是举个例子console.log("Yay! " + successMessage);
});
对于已经实例化过的 promise 对象可以调用 promise.then() 方法,传递 resolve 和 reject 方法作为回调。
promise.then() 是 promise 最为常用的方法。
promise.then(onFulfilled, onRejected)
promise简化了对error的处理,上面的代码我们也可以这样写:
promise.then(onFulfilled).catch(onRejected)
Promisethen方法:
Promise.prototype.then 方法返回的是一个新的 Promise 对象,因此可以采用链式写法。
getJSON("/posts.json").then(function(json) {return json.post;
}).then(function(post) {// proceed
});
上面的代码使用 then 方法,依次指定了两个回调函数。第一个回调函数完成以后,会将返回结果作为参数,传入第二个回调函数。如果前一个回调函数返回的是Promise对象,这时后一个回调函数就会等待该Promise对象有了运行结果,才会进一步调用。
getJSON("/post/1.json").then(function(post) {return getJSON(post.commentURL);
}).then(function(comments) {// 对comments进行处理
});
这种设计使得嵌套的异步操作,可以被很容易得改写,从回调函数的"横向发展"改为"向下发展"。
Promise.catch方法:
Promise.prototype.catch 方法是 Promise.prototype.then(null, rejection) 的别名,用于指定发生错误时的回调函数。
getJSON("/posts.json").then(function(posts) {// some code
}).catch(function(error) {// 处理前一个回调函数运行时发生的错误console.log('发生错误!', error);
});
Promise 对象的错误具有"冒泡"性质,会一直向后传递,直到被捕获为止。也就是说,错误总是会被下一个 catch 语句捕获。
getJSON("/post/1.json").then(function(post) {return getJSON(post.commentURL);
}).then(function(comments) {// some code
}).catch(function(error) {// 处理前两个回调函数的错误
});
JavaScript Promise对象相关推荐
- JavaScript Promise对象详解
Promise是JavaScript异步操作解决方案.介绍Promise之前,先对异步操作做一个详细介绍. JavaScript的异步执行 概述 Javascript语言的执行环境是"单线程 ...
- JavaScript:学习笔记(9)——Promise对象
JavaScript:学习笔记(9)--Promise对象 引入Promise Primose是异步编程的一种解决方案,比传统的解决方案回调函数和事件更加合理和强大.如下面为基于回调函数的Ajax操作 ...
- promise用法_【JavaScript 教程】异步操作——Promise 对象
作者 | 阮一峰 概述 Promise 对象是 JavaScript 的异步操作解决方案,为异步操作提供统一接口.它起到代理作用(proxy),充当异步操作与回调函数之间的中介,使得异步操作具备同步操 ...
- JavaScript异步编程(1)- ECMAScript 6的Promise对象
JavaScript的Callback机制深入人心.而ECMAScript的世界同样充斥的各种异步操作(异步IO.setTimeout等).异步和Callback的搭载很容易就衍生"回调金字 ...
- JavaScript简餐——Promise对象的实例方法
文章目录 前言 一.Promise的实例方法 1.Promise.prototype.then() 2.Promise.prototype.catch() 3.Promise.prototype.fi ...
- javascript中的异步调用,promise对象,async/await用法
原生javascript中的的回调函数 即callback 就是通过回调函数来通知主程序 对于io 密集的非常好用:eg. file,DB读写,网络访问 异步: javascript就是个单线程语言, ...
- javascript之异步操作理解---回调函数,async,await以及promise对象
javascript之异步操作理解---回调函数,async,await以及promise对象 概述 概述 写在前面:虽然平时做项目,但是发现自己写的代码还是很烂.最近接触了一个对性能要求比较高的项目 ...
- 【JavaScript 教程】ES6 中的 Promise对象 详解
[JavaScript 教程]ES6 中的 Promise对象 详解 1.Promise对象含义 promise是异步编程的一种解决方法. 所谓promise,简单说是一个容器,里面保存着某个未来才会 ...
- Javascript 在循环中使用Promise对象
先看一个生成Promise对象的方法 function createPromise() {var promise;promise = new Promise(function(resolve, rej ...
最新文章
- symbian 根据指定的权限找到对应的API:Functions listed by capability
- CI 模型公用查询函数
- 有兴趣吗?程序员分手手册,教你如何恢复单身
- Java基础入门笔记-包装类
- Oracle sqlserver mysql的自增变量设置
- python中魔法函数_02 python中魔法函数
- xml 和android脚本之家,Android开发之XML文件解析的使用
- Hadoop入门扫盲:hadoop发行版介绍与选择
- CSS缩小窗口时,背景图出现右侧空白
- findfont: Font family [‘Times New Roman‘] not found. Falling back to DejaVu Sans.
- Google 加入反 IE6 联盟:IE6 真的能被消灭吗?
- 浅谈今天所学的Jquery 中的filter()方法
- 【WPA TSP】基于matlab狼群算法求解旅行商问题【含Matlab源码 211期】
- 数据库安全关键技术之数据库脱敏技术详解
- kindle看pdf不清楚_Kindle 对 PDF 的支持真的很糟糕吗?
- 作业:欧拉公式以及凉鞋问题
- 破解Windows7开机密码
- MSP432E401Y-按键中断点灯
- 人机协同变电站智能化发展,嵌入式为电网安全护航
- gradle-6.5.1-all 快速下载
热门文章
- ngxin做http强制跳转https,接口的POST请求变成了GET
- 2018年AI要怎么“玩”?李飞飞和李开复在达沃斯论坛上给出这几点…
- 多领域合作 浪潮与美亚柏科赋能信息安全
- .net快速创建PDF文档 by c#
- ASP.NET的内置对象
- IMAP与POP3的比较
- Q1 SpringBoot启动类如何作为配置类注册进Spring容器的?(ok)
- python培训多久能入职_Python学到什么程度可以面试工作?
- 【HISI系列】之Hi3559A V100R001C02SPC010文档及SDK
- linux查找、搜索字符或文件