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代码
Nov 23 Javascript
IE与FireFox中的childNodes区别
Oct 20 Javascript
JS分页效果示例
Oct 11 Javascript
JavaScript动态操作表格实例(添加,删除行,列及单元格)
Nov 25 Javascript
jQuery处理图片加载失败的常用方法
Jun 08 Javascript
JS实现的Select三级下拉菜单代码
Aug 20 Javascript
TypeOf这些知识点你了解吗
Feb 21 Javascript
探究Vue.js 2.0新增的虚拟DOM
Oct 20 Javascript
使用jQuery和ajax代替iframe的方法(详解)
Apr 12 jQuery
js实现Tab选项卡切换效果
Jul 17 Javascript
mpvue实现左侧导航与右侧内容的联动
Oct 21 Javascript
JavaScript继承的三种方法实例
May 12 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
Drupal简体中文语言包安装教程
2014/09/27 PHP
CI框架装载器Loader.php源码分析
2014/11/04 PHP
PHP反射API示例分享
2016/10/08 PHP
PHP-X系列教程之内置函数的使用示例
2017/10/16 PHP
PHP中OpenSSL加密问题整理
2017/12/14 PHP
PHP根据key删除数组中指定的元素
2019/02/28 PHP
通过ifame指向的页面高度调整iframe的高度
2006/10/05 Javascript
Javascript学习笔记4 Eval函数
2010/01/11 Javascript
jquery.post用法关于type设置问题补充
2014/01/03 Javascript
使用jQuery动态加载js脚本文件的方法
2014/04/03 Javascript
js点击事件链接的问题解决
2014/04/25 Javascript
JS实现横向拉伸动感伸缩菜单效果代码
2015/09/04 Javascript
ECMA5数组的新增方法有哪些及forEach()模仿实现
2015/11/03 Javascript
Jquery 效果使用详解
2015/11/23 Javascript
jQuery实现ajax调用WCF服务的方法(附带demo下载)
2015/12/04 Javascript
js实现键盘自动打字效果
2016/12/23 Javascript
输入框点击时边框变色效果的实现方法
2016/12/26 Javascript
vue组件间通信解析
2017/03/01 Javascript
基于JavaScript实现图片剪切效果
2017/03/07 Javascript
解决vue router使用 history 模式刷新后404问题
2017/07/19 Javascript
初探JavaScript 面向对象(推荐)
2017/09/03 Javascript
基于 D3.js 绘制动态进度条的实例详解
2018/02/26 Javascript
微信小程序提交form操作示例
2018/12/30 Javascript
vue中echarts引入中国地图的案例
2020/07/28 Javascript
js在HTML的三种引用方式详解
2020/08/29 Javascript
Vue中避免滥用this去读取data中数据
2021/03/02 Vue.js
Python随机生成彩票号码的方法
2015/03/05 Python
Python全排列操作实例分析
2018/07/24 Python
python退出命令是什么?详解python退出方法
2018/12/10 Python
python对象与json相互转换的方法
2019/05/07 Python
Python字符串及文本模式方法详解
2020/09/10 Python
高一自我鉴定
2013/12/17 职场文书
自主招生英文自荐信
2015/03/25 职场文书
2015教师年度工作总结范文
2015/04/07 职场文书
2015年财务个人工作总结范文
2015/05/22 职场文书
信息技术课教学反思
2016/02/23 职场文书