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 Math ceil()、floor()、round()三个函数的区别
Mar 09 Javascript
在JavaScript中监听IME键盘输入事件
May 29 Javascript
JavaScript高级程序设计(第3版)学习笔记4 js运算符和操作符
Oct 11 Javascript
Js 正则表达式知识汇总
Dec 02 Javascript
JS采用绝对定位实现回到顶部效果完整实例
Jun 20 Javascript
jQuery设置聚焦并使光标位置在文字最后的实现方法
Aug 02 Javascript
更靠谱的H5横竖屏检测方法(js代码)
Sep 13 Javascript
Canvas 制作动态进度加载水球详解及实例代码
Dec 09 Javascript
bootstrapValidator表单验证插件学习
Dec 30 Javascript
mpvue全局引入sass文件的方法步骤
Mar 06 Javascript
layer关闭当前窗口页面以及确认取消按钮的方法
Sep 09 Javascript
JS实现数据动态渲染的竖向步骤条
Jun 24 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  Yii清理缓存的实现方法
2016/11/10 PHP
PHP+Mysql无刷新问答评论系统(源码)
2016/12/20 PHP
JQuery 小练习(实例代码)
2009/08/07 Javascript
javascript中字符串拼接需注意的问题
2010/07/13 Javascript
jquery ajax 同步异步的执行 return值不能取得的解决方案
2012/01/08 Javascript
非常好用的JsonToString 方法 简单实例
2013/07/18 Javascript
JavaScript中的prototype.bind()方法介绍
2014/04/04 Javascript
javascript中with()方法的语法格式及使用
2014/08/04 Javascript
Nodejs极简入门教程(二):定时器
2014/10/25 NodeJs
jQuery中closest和parents的区别分析
2015/05/07 Javascript
javascript格式化日期时间方法汇总
2015/06/19 Javascript
Bootstrap页面布局基础知识全面解析
2016/06/13 Javascript
AngularJS的依赖注入实例分析(使用module和injector)
2017/01/19 Javascript
Jil,高效的json序列化和反序列化库
2017/02/15 Javascript
vue 实现数字滚动增加效果的实例代码
2018/07/06 Javascript
React-redux实现小案例(todolist)的过程
2019/09/29 Javascript
node.js中Buffer缓冲器的原理与使用方法分析
2019/11/23 Javascript
微信小程序学习总结(二)样式、属性、模板操作分析
2020/06/04 Javascript
vue 监听窗口变化对页面部分元素重新渲染操作
2020/07/28 Javascript
vue中如何自定义右键菜单详解
2020/12/08 Vue.js
PyTorch中Tensor的维度变换实现
2019/08/18 Python
Django3.0 异步通信初体验(小结)
2019/12/04 Python
浅谈python的elementtree模块处理中文注意事项
2020/03/06 Python
浅谈盘点5种基于Python生成的个性化语音方法
2021/02/05 Python
巴西体育用品商店:Lojão dos Esportes
2018/07/21 全球购物
碧欧泉法国官网:Biotherm法国
2019/10/23 全球购物
感恩节活动策划方案
2014/05/16 职场文书
2015年体育教师个人工作总结
2015/05/12 职场文书
2015年除四害工作总结
2015/07/23 职场文书
教师节主题班会方案
2015/08/17 职场文书
2015年教师个人业务工作总结
2015/10/23 职场文书
2016春季田径运动会广播稿
2015/12/21 职场文书
考教师资格证不要错过的4个最佳时机
2019/07/17 职场文书
React配置子路由的实现
2021/06/03 Javascript
Python包argparse模块常用方法
2021/06/04 Python
为什么MySQL 删除表数据 磁盘空间还一直被占用
2021/10/16 MySQL