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 相关文章推荐
IE6不能修改NAME问题的解决方法
Sep 03 Javascript
我的Node.js学习之路(二)NPM模块管理
Jul 06 Javascript
jquery mobile页面跳转后样式丢失js失效的解决方法
Sep 06 Javascript
jQuery height()、innerHeight()、outerHeight()函数的区别详解
May 23 Javascript
vue init失败简单解决方法(终极版)
Dec 22 Javascript
对Vue beforeRouteEnter 的next执行时机详解
Aug 25 Javascript
如何进行微信公众号开发的本地调试的方法
Jun 16 Javascript
layui内置模块layim发送图片添加加载动画的方法
Sep 23 Javascript
解决vue v-for src 图片路径问题 404
Nov 12 Javascript
vscode 调试 node.js的方法步骤
Sep 15 Javascript
vue-cli3项目打包后自动化部署到服务器的方法
Sep 16 Javascript
插件导致ECharts被全量引入的坑示例解析
Sep 23 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
利用ThinkPHP内置的ThinkAjax实现异步传输技术的实现方法
2011/12/19 PHP
PHP使用mysql_fetch_row查询获得数据行列表的方法
2015/03/18 PHP
PHP使用CURL模拟登录的方法
2015/07/08 PHP
php给图片加文字水印
2015/07/31 PHP
php构造函数与析构函数
2016/04/23 PHP
php封装的表单验证类完整实例
2016/10/19 PHP
PHP全局使用Laravel辅助函数dd
2019/12/26 PHP
JQuery 学习笔记 选择器之六
2009/07/23 Javascript
js 自定义个性下拉选择框示例
2013/08/20 Javascript
浅谈angular.js中实现双向绑定的方法$watch $digest $apply
2015/10/14 Javascript
JavaScript实现点击按钮切换网页背景色的方法
2015/10/17 Javascript
全面解析Bootstrap排版使用方法(文字样式)
2015/11/30 Javascript
浅谈javascript运算符——条件,逗号,赋值,()和void运算符
2016/07/15 Javascript
JavaScript学习小结之被嫌弃的eval函数和with语句实例详解
2016/08/01 Javascript
vue axios基于常见业务场景的二次封装的实现
2018/09/21 Javascript
JS+CSS3实现的简易钟表效果示例
2019/04/13 Javascript
浅谈vue限制文本框输入数字的正确姿势
2019/09/02 Javascript
Vue+ElementUI table实现表格分页
2019/12/14 Javascript
微信小程序地图绘制线段并且测量(实例代码)
2020/01/02 Javascript
详解vue v-model
2020/08/31 Javascript
基于Cesium绘制抛物弧线
2020/11/18 Javascript
Django数据库连接丢失问题的解决方法
2018/12/29 Python
Django接收自定义http header过程详解
2019/08/23 Python
Python根据字典的值查询出对应的键的方法
2020/09/30 Python
CSS3 制作旋转的大风车(充满童年回忆)
2013/01/30 HTML / CSS
css3 column实现卡片瀑布流布局的示例代码
2018/06/22 HTML / CSS
达拉斯牛仔官方商店:Dallas Cowboys Pro Shop
2018/02/10 全球购物
static函数与普通函数有什么区别
2015/12/25 面试题
幼儿园实习自我鉴定
2013/12/15 职场文书
校园摄影活动策划方案
2014/02/05 职场文书
交通事故协议书
2014/04/15 职场文书
禁止酒驾标语
2014/06/25 职场文书
学校学习雷锋活动总结
2014/07/03 职场文书
2014年超市员工工作总结
2014/11/18 职场文书
农村老人去世追悼词
2015/06/23 职场文书
golang生成vcf通讯录格式文件详情
2022/03/25 Golang