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 相关文章推荐
下载文件个别浏览器文件名乱码解决办法
Mar 19 Javascript
javascript操作css属性
Dec 30 Javascript
浅谈关于JavaScript API设计的一些建议和准则
Jun 24 Javascript
JS 对象(Object)和字符串(String)互转方法
May 20 Javascript
easyUI实现(alert)提示框自动关闭的实例代码
Nov 07 Javascript
vue日期组件 支持vue1.0和2.0
Jan 09 Javascript
jQuery阻止移动端遮罩层后页面滚动
Mar 15 Javascript
react-native 封装选择弹出框示例(试用ios&android)
Jul 11 Javascript
快速理解 JavaScript 中的 LHS 和 RHS 查询的用法
Aug 24 Javascript
vue项目动态设置页面title及是否缓存页面的问题
Nov 08 Javascript
详解用JS添加和删除class类名
Mar 25 Javascript
5种方法告诉你如何使JavaScript 代码库更干净
Sep 15 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
1 Tube Radio
2021/03/02 无线电
ThinkPHP模板中数组循环实例
2014/10/30 PHP
PHP导出带样式的Excel示例代码
2016/08/28 PHP
Apache站点配置SSL强制跳转443
2021/03/09 Servers
jquery创建div 实现代码
2009/04/27 Javascript
简单实例处理url特殊符号&处理(2种方法)
2013/04/02 Javascript
javascript放大镜效果的简单实现
2013/12/09 Javascript
jQuery实现设置、移除文本框默认值功能
2015/01/13 Javascript
Java中Timer的用法详解
2015/10/21 Javascript
js 自带的 map() 方法全面了解
2016/08/16 Javascript
JS检测数组类型的方法小结
2017/03/14 Javascript
JavaScript的setter与getter方法
2017/11/29 Javascript
基于Vue、Vuex、Vue-router实现的购物商城(原生切换动画)效果
2018/01/09 Javascript
浅谈如何优雅处理JavaScript异步错误
2019/11/12 Javascript
[04:32]DOTA2著名解说配音敌法师 现场专访海涛怒切假腿
2013/12/20 DOTA
Python中基础的socket编程实战攻略
2016/06/01 Python
详解Python中的array数组模块相关使用
2016/07/05 Python
python实现顺序表的简单代码
2018/09/28 Python
3分钟学会一个Python小技巧
2018/11/23 Python
pycharm远程开发项目的实现步骤
2019/01/20 Python
分析经典Python开发工程师面试题
2019/04/08 Python
python PIL和CV对 图片的读取,显示,裁剪,保存实现方法
2019/08/07 Python
Python Scrapy多页数据爬取实现过程解析
2020/06/12 Python
Python模拟键盘输入自动登录TGP
2020/11/27 Python
使用Python通过oBIX协议访问Niagara数据的示例
2020/12/04 Python
英国儿童家具专卖店:GLTC
2016/09/24 全球购物
国际领先的在线时尚服装和配饰店:DressLily
2019/03/03 全球购物
小学生班会演讲稿
2014/01/09 职场文书
黄河的主人教学反思
2014/02/07 职场文书
十八大宣传标语
2014/10/09 职场文书
企业党的群众路线教育实践活动学习心得体会
2014/10/31 职场文书
学生党员检讨书范文
2014/12/27 职场文书
2015年小学数学教师个人工作总结
2015/05/25 职场文书
中学后勤工作总结2015
2015/07/22 职场文书
导游词之潮音寺
2019/09/26 职场文书
Vue鼠标滚轮滚动切换路由效果的实现方法
2021/08/04 Vue.js