ES6新特性六:promise对象实例详解
发布时间 - 2026-01-11 00:45:42 点击率:次本文实例讲述了ES6新特性之promise对象。分享给大家供大家参考,具体如下:

1. promise 介绍
它是一个对象,也就是说与其他JavaScript对象的用法,没有什么两样;其次,它起到代理作用(proxy),充当异步操作与回调函数之间的中介。它使得异步操作具备同步操作的接口,使得程序具备正常的同步运行的流程,回调函数不必再一层层嵌套。
它的思想是,每一个异步任务立刻返回一个Promise对象,由于是立刻返回,所以可以采用同步操作的流程。这个Promises对象有一个then方法,允许指定回调函数,在异步任务完成后调用。
异步操作f1返回一个Promise对象,它的回调函数f2写法如下
(new Promise(f1)).then(f2);
2. promise 对象的三种状态
① 异步操作未完成(pending)
② 异步操作已完成(resolved)
③ 异步操作失败(rejected)
3. 工作过程
Promise对象使用then方法添加回调函数。then方法可以接受两个回调函数,第一个是异步操作成功时(变为resolved状态)时的回调函数,第二个是异步操作失败(变为rejected)时的回调函数(可以省略)。一旦状态改变,就调用相应的回调函数,这两个回调函数都接受异步操作传回的值作为参数。
promise.then( console.log, console.error );
4. then 的链式使用
① 首先then方法返回的一个新的promise对象,因此可以采用链式写法。
② then方法的第一个参数是Resolved状态的回调函数,第二个参数(可选)是Rejected状态的回调函数。
③ 如下,promise的状态一旦变为resolved,就依次调用后面每一个then指定的回调函数,每一步都必须等到前一步完成,才会执行。最后一个then方法的回调函数console.log和console.error,用法上有一点重要的区别。console.log只显示回调函数step3的返回值,console.error可以显示step1、step2、step3之中任意一个发生的错误,Promises对象的错误有传递性。
promise .then(step1) .then(step2) .then(step3) .then( console.log, console.error );
5. promise 对象的使用
var promise = new Promise(function(resolve, reject) { // promise的构造函数,Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject
// 异步操作的代码
if (/* 异步操作成功 */){
resolve(value);//将异步的操作结果作为参数传递出去
} else {
reject(error);
}
});
其中resolve和reject它们是两个函数,由JavaScript引擎提供,不用自己部署。
resolve函数的作用:将Promise对象的状态从“未完成”变为“成功”(即从Pending变为Resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;
reject函数的作用:将Promise对象的状态从“未完成”变为“失败”(即从Pending变为Rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。
① 下面是一个用Promise对象实现的Ajax操作的例子
var getJSON = function(url) {
var promise = new Promise(function(resolve, reject){
var client = new XMLHttpRequest();
client.open("GET", url);
client.onreadystatechange = handler;
client.responseType = "json";
client.setRequestHeader("Accept", "application/json");
client.send();
function handler() {
if (this.readyState !== 4) {
return;
}
if (this.status === 200) {
resolve(this.response);//会将参数传递给回调函数
} else {
reject(new Error(this.statusText));
}
};
});
return promise;
};
getJSON("/posts.json").then(function(json) {
console.log('Contents: ' + json);
}, function(error) {
console.error('出错了', error);
});
② resolve函数的参数除了正常的值以外,还可能是另一个Promise实例,即一个异步操作的结果是返回另一个异步操作。
var p1 = new Promise(function (resolve, reject) {
// ...
});
var p2 = new Promise(function (resolve, reject) {
// ...
resolve(p1);
})
6.Promise.prototype.catch()
① 一个 Promise 对象,如果异步操作抛出错误,状态就会变为Rejected,就会调用catch方法指定的回调函数,处理这个错误。
promise.then(function(posts) {
// ...
}).catch(function(error) {
// 处理 getJSON 和 前一个回调函数运行时发生的错误
console.log('发生错误!', error);
});
② 另外,then方法指定的回调函数,如果运行中抛出错误,也会被catch方法捕获。
var promise = new Promise(function(resolve, reject) {
throw new Error('test');
});
promise.catch(function(error) {
console.log(error);
});
// Error: test
③ 另外两种写法
// 写法一
var promise = new Promise(function(resolve, reject) {
try {
throw new Error('test');
} catch(e) {
reject(e);
}
});
promise.catch(function(error) {
console.log(error);
});
// 写法二
var promise = new Promise(function(resolve, reject) {
reject(new Error('test'));//reject方法的作用,等同于抛出错误
});
promise.catch(function(error) {
console.log(error);
});
④ Promise 在resolve语句后面再抛出错误不会被捕获。因为 Promise 的状态一旦改变,就永久保持该状态,不会再变了。
var promise = new Promise(function(resolve, reject) {
resolve('ok');
throw new Error('test');
});
promise
.then(function(value) { console.log(value) })
.catch(function(error) { console.log(error) });
// ok
7 Promise.all()
参数为Promise 对象的数组;将多个Promisre 对象包装成一个新的Promise 对象,如果数组中不是Promise 对象,就会自动调用 Promise.resolve方法,将参数转为Promise实例,再进一步处理。(Promise.all方法的参数可以不是数组,但必须具有Iterator接口,且返回的每个成员都是Promise实例)
var p = Promise.all(promises).then(function (posts) {
// ...
}).catch(function(reason){
// ...
});
① 只要promises之中有一个状态变为rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。
② 如果全部都变为resolved;此时 promises 数组中所有对象的返回值组成一个数组,传递给p的回调函数。
8 Promise.resolve()
将现有对象转为 Promise对象,Promise.resolve方法就起到这个作用。
Promise.resolve('foo')
// 等价于
new Promise(resolve => resolve('foo'))
① 参数为Priomise 对象,Promise.resolve() 不做任何处理。
② 参数是一个具有 then 方法的对象:Promise.resolve方法会将这个对象转为Promise对象,然后就立即执行thenable对象的then方法。
let thenable = {
then: function(resolve, reject) {
resolve(42);
}
};
let p1 = Promise.resolve(thenable);//p1为一个状态已经是resolved 的promise对象.
p1.then(function(value) {
console.log(value); // 42
});
③ 参数不是具有then方法的对象,或根本就不是对象
该参数变为生成的 Promise 对象的 resolve() 的参数。
var p = Promise.resolve('Hello');//Hello 会传递给 p 的resolve()
p.then(function (s){
console.log(s)
});
// Hello
希望本文所述对大家ECMAScript程序设计有所帮助。
# ES6
# 新特性
# promise对象
# ES6中非常实用的新特性介绍
# JavaScript ES6的新特性使用新方法定义Class
# JavaScript中的Reflect对象详解(ES6新特性)
# 深入浅出ES6新特性之函数默认参数和箭头函数
# 简单谈谈ES6的六个小特性
# ES6新特性之Symbol类型用法分析
# ES6(ECMAScript 6)新特性之模板字符串用法分析
# ES6新特性之变量和字符串用法示例
# ES6新特性之模块Module用法详解
# ES6新特性之字符串的扩展实例分析
# ES6新特性二:Iterator(遍历器)和for-of循环详解
# ES6新特性七:数组的扩充详解
# ES6新特性八:async函数用法实例详解
# ES6新特性之类(Class)和继承(Extends)相关概念与用法分析
# 让微信小程序支持ES6中Promise特性的方法详解
# ES6新特性:使用export和import实现模块化详解
# es6新特性之 class 基本用法解析
# ES6 13个新特性总结
# 回调
# 就会
# 链式
# 第一个
# 抛出
# 是一个
# 未完成
# 返回值
# 第二个
# 并将
# 会将
# 有一个
# 即从
# 组中
# 都是
# 也会
# 多个
# 才会
# 两种
# 上有
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
php做exe能调用系统命令吗_执行cmd指令实现方式【详解】
敲碗10年!Mac系列传将迎来「触控与联网」双革新
Laravel Blade模板引擎语法_Laravel Blade布局继承用法
python中快速进行多个字符替换的方法小结
Laravel怎么清理缓存_Laravel optimize clear命令详解
Laravel如何为API生成Swagger或OpenAPI文档
为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】
如何在IIS管理器中快速创建并配置网站?
Win11怎样安装网易有道词典_Win11安装词典教程【步骤】
Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
JavaScript如何实现类型判断_typeof和instanceof有什么区别
EditPlus中的正则表达式 实战(2)
Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转
Laravel中间件如何使用_Laravel自定义中间件实现权限控制
Laravel如何实现API速率限制?(Rate Limiting教程)
网站图片在线制作软件,怎么在图片上做链接?
利用vue写todolist单页应用
西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?
javascript如何操作浏览器历史记录_怎样实现无刷新导航
Swift中switch语句区间和元组模式匹配
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
JavaScript实现Fly Bird小游戏
如何在宝塔面板创建新站点?
php485函数参数是什么意思_php485各参数详细说明【介绍】
Laravel如何创建自定义Facades?(详细步骤)
怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?
昵图网官方站入口 昵图网素材图库官网入口
Laravel如何使用Seeder填充数据_Laravel模型工厂Factory批量生成测试数据【方法】
如何确认建站备案号应放置的具体位置?
Laravel中的withCount方法怎么高效统计关联模型数量
Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解
C++时间戳转换成日期时间的步骤和示例代码
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南
如何快速打造个性化非模板自助建站?
宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法
用yum安装MySQLdb模块的步骤方法
Linux后台任务运行方法_nohup与&使用技巧【技巧】
香港服务器选型指南:免备案配置与高效建站方案解析
如何用搬瓦工VPS快速搭建个人网站?
laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法
Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】
Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知
Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明
实现点击下箭头变上箭头来回切换的两种方法【推荐】
jquery插件bootstrapValidator表单验证详解
大型企业网站制作流程,做网站需要注册公司吗?
如何用西部建站助手快速创建专业网站?
Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门

