node.js Promise对象的使用方法实例分析


Posted in Javascript onDecember 26, 2019

本文实例讲述了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)
  }
);

下面我们分别定义三个方法,参数为延时执行的秒数

  1. chenqionghe
  2. get
  3. 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秒后执行

重点:

  1. Promise 对象的错误具有“冒泡”性质,会一直向后传递,直到被捕获为止。也就是说,错误总是会被下一个catch语句捕获。
  2. 一般来说,不要在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]);
  1. 当p1、p2、p3都执行功能,会调用p的回调函数,传p1、p2、p3返回值的一个数组
  2. 当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程序设计有所帮助。

Javascript 相关文章推荐
用js重建星际争霸
Dec 22 Javascript
jQuery 处理网页内容的实现代码
Feb 15 Javascript
奉献给JavaScript初学者的编写开发的七个细节
Jan 11 Javascript
基于Jquery的仿照flash放大图片效果代码
Mar 16 Javascript
JQury slideToggle闪烁问题及解决办法
Jul 05 Javascript
javascript学习笔记(十一) 正则表达式介绍
Jun 20 Javascript
深入理解javascript动态插入技术
Nov 12 Javascript
jqueryUI里拖拽排序示例分析
Feb 26 Javascript
jquery中cookie用法实例详解(获取,存储,删除等)
Jan 04 Javascript
vue2.0+vuex+localStorage代办事项应用实现详解
May 31 Javascript
vuex 解决报错this.$store.commit is not a function的方法
Dec 17 Javascript
策略模式实现 Vue 动态表单验证的方法
Sep 16 Javascript
js回调函数仿360开机
Dec 26 #Javascript
js仿360开机效果
Dec 26 #Javascript
element-ui中按需引入的实现
Dec 25 #Javascript
原生JS实现顶部导航栏显示按钮+搜索框功能
Dec 25 #Javascript
jQuery+PHP+Ajax实现动态数字统计展示功能
Dec 25 #jQuery
解决Vue 刷新页面导航显示高亮位置不对问题
Dec 25 #Javascript
Vue 路由间跳转和新开窗口的方式(query、params)
Dec 25 #Javascript
You might like
PHP语法速查表
2006/12/06 PHP
一道关于php变量引用的面试题
2010/08/08 PHP
Laravel 5.3 学习笔记之 配置
2016/08/28 PHP
PHP 实现浏览记录并按日期分组
2017/05/11 PHP
php smtp实现发送邮件功能
2017/06/22 PHP
php+redis实现商城秒杀功能
2020/11/19 PHP
关于js获取radio和select的属性并控制的代码
2011/05/12 Javascript
Javascript前端UI框架Kit使用指南之Kitjs简介
2014/11/28 Javascript
javaScript中slice函数用法实例分析
2015/06/08 Javascript
原生js模拟淘宝购物车项目实战
2015/11/18 Javascript
Three.js学习之网格
2016/08/10 Javascript
js Canvas绘制圆形时钟效果
2017/02/17 Javascript
简单谈谈require模块化jquery和angular的问题
2017/06/23 jQuery
BootStrap Validator 根据条件在JS中添加或移除校验操作
2017/10/12 Javascript
Vue写一个简单的倒计时按钮功能
2018/04/20 Javascript
微信小程序云开发获取文件夹下所有文件(推荐)
2019/11/14 Javascript
Vue实现随机验证码功能
2020/12/29 Vue.js
[01:11:28]DOTA2-DPC中国联赛定级赛 RNG vs Phoenix BO3第一场 1月8日
2021/03/11 DOTA
Python中的__new__与__init__魔术方法理解笔记
2014/11/08 Python
[原创]python爬虫(入门教程、视频教程)
2018/01/08 Python
Python叠加两幅栅格图像的实现方法
2019/07/05 Python
PYTHON EVAL的用法及注意事项解析
2019/09/06 Python
Python实现一个优先级队列的方法
2020/07/31 Python
施华洛世奇水晶荷兰官方网站:SWAROVSKI荷兰
2017/05/12 全球购物
Under Armour西班牙官网:美国知名的高端功能性运动品牌
2018/12/12 全球购物
法国滑雪假期的专家:Ski Planet
2019/11/02 全球购物
Why we need EJB
2016/10/20 面试题
临床医师专业个人自我评价范文
2013/11/07 职场文书
教师个人的自我评价分享
2014/01/02 职场文书
管理失职检讨书
2014/02/12 职场文书
思想纪律作风整顿剖析材料
2014/10/11 职场文书
山东省召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
导游词之广东佛山(南风古灶)
2019/09/24 职场文书
NodeJs内存占用过高的排查实战记录
2021/05/10 NodeJs
Vue全局事件总线你了解吗
2022/02/24 Vue.js
CSS 鼠标选中文字后改变背景色的实现代码
2023/05/21 HTML / CSS