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 相关文章推荐
JavaScript脚本语言在网页中的简单应用
May 13 Javascript
Prototype 学习 Prototype对象
Jul 12 Javascript
javascript下利用arguments实现string.format函数
Aug 24 Javascript
判断用户是否在线的代码
Mar 05 Javascript
node.js实现BigPipe详解
Dec 05 Javascript
js正则表达式中exec用法实例
Jul 23 Javascript
js实现页面跳转的五种方法推荐
Mar 10 Javascript
vue登录路由验证的实现
Dec 13 Javascript
Node.js Express安装与使用教程
May 11 Javascript
javascript 原型与原型链的理解及实例分析
Nov 23 Javascript
如何在Express4.x中愉快地使用async的方法
Nov 18 Javascript
vuex Module将 store 分割成模块的操作
Dec 07 Vue.js
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注入点构造代码
2008/06/14 PHP
PHP循环语句笔记(foreach,list)
2011/11/29 PHP
thinkPHP实现MemCache分布式缓存功能
2016/03/23 PHP
firefox中用javascript实现鼠标位置的定位
2007/06/17 Javascript
[原创]IE view-source 无法查看看源码 JavaScript看网页源码
2009/07/19 Javascript
浅谈Javascript 数组与字典
2015/01/29 Javascript
JavaScript中this的9种应用场景及三种复合应用场景
2015/09/12 Javascript
jQuery实现的Tab滑动选项卡及图片切换(多种效果)小结
2015/09/14 Javascript
基于JavaScript实现全屏透明遮罩div层锁屏效果
2016/01/26 Javascript
去除字符串左右两边的空格(实现代码)
2016/05/12 Javascript
JS实现添加,替换,删除节点元素的方法
2016/06/30 Javascript
NodeJs安装npm包一直失败的解决方法
2017/04/28 NodeJs
vuejs2.0子组件改变父组件的数据实例
2017/05/10 Javascript
Vue.js上下滚动加载组件的实例代码
2017/07/17 Javascript
Vue实现6位数密码效果
2018/08/18 Javascript
使用pm2自动化部署node项目的方法步骤
2019/01/28 Javascript
Vue表情输入组件 微信face表情组件
2019/02/11 Javascript
Vue学习之axios的使用方法实例分析
2020/01/06 Javascript
vue使用echarts画组织结构图
2021/02/06 Vue.js
[56:18]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#2 MVP.Phx VS Fnatic第二局
2016/03/05 DOTA
[58:59]完美世界DOTA2联赛PWL S3 access vs CPG 第一场 12.13
2020/12/16 DOTA
python迭代器的使用方法实例
2013/11/21 Python
探究Python多进程编程下线程之间变量的共享问题
2015/05/05 Python
python算法题 链表反转详解
2019/07/02 Python
python Django 创建应用过程图示详解
2019/07/29 Python
Python通过递归获取目录下指定文件代码实例
2019/11/07 Python
基于python-pptx库中文文档及使用详解
2020/02/14 Python
keras-siamese用自己的数据集实现详解
2020/06/10 Python
浅析python实现动态规划背包问题
2020/12/31 Python
HTML5实现经典坦克大战坦克乱走还能发出一个子弹
2013/09/02 HTML / CSS
荷兰浴室和卫浴网上商店:Badkamerxxl.nl
2020/10/06 全球购物
销售副总经理岗位职责
2013/12/11 职场文书
工地标语大全
2014/06/18 职场文书
寒假致家长的一封信
2015/10/10 职场文书
postman中form-data、x-www-form-urlencoded、raw、binary的区别介绍
2022/01/18 HTML / CSS
MySQL池化框架学习接池自定义
2022/07/23 MySQL