node.js的Promise对象的使用
一、Promise对象的定义
Promise对象用来将异步操作以同步操作的流程表达出来,定义如下
let flag = true;
const hello = new Promise(function (resolve, reject) {
if (false) {//异步操作成功
resolve("success");
} else {
reject("error");
}
});
二、链式调用-then方法
使用then方法调用,第一个参数是成功回调,第二个参数是失败回调,如下
hello.then(
function (value) {
console.log(value)
},
function (err) {
console.log(err)
}
);
下面我们分别定义三个方法,参数为延时执行的秒数
- chenqionghe
- get
- muslce
function chenqionghe(second) {
return new Promise((resolve, reject) => {
setTimeout(function () {
console.log("chenqionghe");
resolve();
}, second * 1000);
})
}
function get(second) {
return new Promise((resolve, reject) => {
setTimeout(function () {
console.log("get");
resolve()
}, second * 1000);
})
}
function muscle(second) {
return new Promise((resolve, reject) => {
setTimeout(function () {
console.log("muscle");
resolve();
}, second * 1000);
})
}
调用如下
chenqionghe(3)
.then(function () {
return get(2)
})
.then(function () {
return muscle(1)
});
运行输出
chenqionghe
get
muscle
这样就实现了链式的调用,相当于同步的方式执行了
如果不使用then调用,会发生什么情况?如下
chenqionghe(3);
get(2);
muscle(1);
结果如下
muscle
get
chenqionghe
我们看到chenqionghe虽然是第一个执行,却是最后输出内容,因为设置了3秒后执行
重点:
- Promise 对象的错误具有“冒泡”性质,会一直向后传递,直到被捕获为止。也就是说,错误总是会被下一个catch语句捕获。
- 一般来说,不要在then方法里面定义 Reject 状态的回调函数(即then的第二个参数),总是使用catch方法。
三、捕获异常-catch
chenqionghe(3)
.then(function () {
return get(2)
})
.then(function () {
throw new Error("abc");
return muscle(1)
})
.catch(function (e) {
console.log("异常:" + e.message)
})
;
输出
chenqionghe
get
异常:abc
异常本质也是一个Promise,所以后面还可以执行then
chenqionghe(3)
.then(function () {
return get(2)
})
.then(function () {
throw new Error("abc");
return muscle(1)
})
.catch(function (e) {
console.log("异常:" + e.message)
})
.then(function () {
console.log("异常后执行")
})
;
运行输出
chenqionghe
get
异常:abc
异常后执行
四、收尾执行-finally
就是不管怎么样,都会执行的方法,即使是抛异常了
chenqionghe(3)
.then(function () {
return get(2)
})
.then(function () {
throw new Error("abc");
return muscle(1)
})
.catch(function (e) {
console.log("异常:" + e.message)
})
.finally(function () {
console.log("最后都会执行的方法")
})
;
执行输出
chenqionghe
get
异常:abc
最后都会执行的方法
finally本质上也是then方法的特例
五、其他方法
all
用于将多个promise实例包装成一个新的promise实例
const p = Promise.all([p1, p2, p3]);
- 当p1、p2、p3都执行功能,会调用p的回调函数,传p1、p2、p3返回值的一个数组
- 当p1、p2、p3其中有一个执行reject,第一个执行reject方法的返回值会传递给p的回调函数
race
类似all,也将多个promise实例包装成一个新的promise实例
不同的是,要p1、p2、p3之中有一个实例发生改变,最先改变的 Promise 实例的返回值会传递给p的回调函数。
resolve
将现有对象转为 Promise 对象
Promise.resolve('foo')
// 等价于
new Promise(resolve => resolve('foo'))
reject
返回一个新的 Promise 实例,该实例的状态为rejected
const p = Promise.reject('出错了');
// 等同于
const p = new Promise((resolve, reject) => reject('出错了'))
node.js的Promise对象的使用的更多相关文章
- Node.js:全局对象
概要:本篇博客主要介绍了node.js中的全局对象. 在JavaScript中,通常window是全局对象,而node.js中的全局对象是global,所有全局变量(除了global本身之外)都是gl ...
- node.js的Promise库-bluebird示例
前两天公司一哥们写了一段node.js代码发给我,后面特意提了一句“写的不太优雅”.我知道,他意思是回调嵌套回调,因为当时比较急也就没有再纠结.然而内心中总记得要解决这个问题.解决node.js的回调 ...
- 在Node.js使用Promise的方式操作Mysql
最近在学习Node.js,虽然早就听说了回调地狱结果过了一周就遇到了.所以花时间学习了了一下Promise.虽然还有Async/await.co.生成器等选择,但是因为本人基础较差,以及时间问题所以决 ...
- Node.js之Promise维护(同步)多个回调(异步)状态
金天:学习一个新东西,就要持有拥抱的心态,如果固守在自己先前的概念体系,就会有举步维艰的感觉..NET程序员初用node.js最需要适应的就是异步开发, 全是异步,常规逻辑下遍历列表都是异步,如何保证 ...
- Node.js之Promise
2015年发布了ES6标准,所谓 Promise,就是ES6标准的一个对象,用来传递异步操作的消息.它代表了某个未来才会知道结果的事件(通常是一个异步操作),并且这个事件提供统一的 API,可供进一步 ...
- 在Node.js使用Promise的方式操作Mysql(续)
在之后的开发中,为了做一些事务开发,我把mysql的连接代码从之前的query函数中分离出来了,直接使用原生的方法进行操作,但发现还是有点问题 原因是原生的node-mysql采用了回调函数的方式,同 ...
- Node.js HTTP Server对象及GET、POST请求
上一博客学习了请求与响应,2次读2次写,但有一个问题就是客户端写入的时候怎么知道请求到达.所以HTTP Server对象出现了.它提供了实现HTTP服务器的基本框架.它可以监听端口的底层套接字和接收请 ...
- when 让你跳出异步回调噩梦 node.js下promise/A规范的使用
其实关于promise 的博客,前端时间专门写了一篇关于 promise 规范的文章,promise规范 让 javascript 中的异步调用更加人性化. 简单回忆下: promise/A规范定义的 ...
- node js 函数和对象
1.函数 1.1匿名函数 函数声明 function fn(){ } 函数表达式 var fun=function(){ } 函数名称和函数名称()的区别 fun/fn fun()/fn() ...
随机推荐
- pyqt QT设计师制作关于对话框(软件版权申明)
一.实验环境 1.anaconda2 2.5.0 + python2.7 2.pyinstaller3.0 二.操作步骤 2.1 启动designer.exe 2.2 单击“文件” -> “新建 ...
- 【带着canvas去流浪(13)】用Three.js制作简易的MARVEL片头动画(下)
目录 一. 模型的制作 1.1 生成字体模型 1.2 多表面贴图 二. 镜头及动画 三. 大作业总结 示例代码托管在:http://www.github.com/dashnowords/blogs 博 ...
- 盘一盘 synchronized (一)—— 从打印Java对象头说起
Java对象头的组成 Java对象的对象头由 mark word 和 klass pointer 两部分组成, mark word存储了同步状态.标识.hashcode.GC状态等等. klass ...
- UTF—8与UTF—8(无bom)格式
BOM——Byte Order Mark,就是字节序标记 在UCS 编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF.而FFFE在U ...
- 没事别想不开做Halcon视觉工程师 halcon机器视觉如何学习?
今天我们来听听看来自一个机器视觉工程师的唠叨和吐槽,在这之后,你还想学人工智能,还想学机器视觉?恭喜你,你对人工智能机器视觉是真爱了! 既然自己选择了这条路,那么无论前进路上有多坎坷,跪着也要走完. ...
- 2019牛客暑期多校训练营(第三场)H题目
题意:给你一个N×N的矩阵,求最大的子矩阵 满足子矩阵中最大值和最小值之差小于等于m. 思路:这题是求满足条件的最大子矩阵,毫无疑问要遍历所有矩阵,并判断矩阵是某满足这个条件,那么我们大致只要解决两个 ...
- Android的步骤
1.开发Activity步骤 第一步:写一个类继承Activity 第二步:重写oncreate方法 第三步:在主配置文件中注册activity <activity android:name=& ...
- redis过期策略与内存淘汰机制分析
过期策略: 我们在set key时,可以给一个expire time,就是过期时间 这段过期时间以后,redis对key删除使用:定期删除+惰性删除 定期删除指redis默认在100ms内随机抽取一些 ...
- ansible批量管理服务 下
1 ansible-playbook 任务剧本 1.1 剧本文件概念 (1)playbook可以将多个批量操作模块功能整合,完成一件事情.(2)简化运维工作复杂度(3)playbook通过yaml语法 ...
- WPF 打开网页
1.利用浏览器打开using System.Diagnostics; Process proc = new System.Diagnostics.Process(); proc.StartInfo.F ...