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 相关文章推荐
[Web]防止用户复制页面内容和另存页面的方法
Feb 06 Javascript
jValidate 基于jQuery的表单验证插件
Dec 12 Javascript
Google AJAX 搜索 API实现代码
Nov 17 Javascript
JQuery扩展插件Validate 1 基本使用方法并打包下载
Sep 05 Javascript
innerHTML,outerHTML,innerText,outerText的用法及区别解析
Dec 16 Javascript
jquery 操作css样式、位置、尺寸方法汇总
Nov 28 Javascript
JavaScript自定义等待wait函数实例分析
Mar 23 Javascript
JavaScript实现广告的关闭与显示效果实例
Jul 02 Javascript
5个最顶级jQuery图表类库插件【jquery插件库】
May 05 Javascript
JavaScript异步上传图片文件的实例代码
Jul 04 Javascript
关于vue.extend和vue.component的区别浅析
Aug 16 Javascript
Echarts实现单条折线可拖拽效果
Dec 19 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
全国FM电台频率大全 - 12 安徽省
2020/03/11 无线电
解析php curl_setopt 函数的相关应用及介绍
2013/06/17 PHP
smarty简单入门实例
2014/11/28 PHP
PHP自毁程序(慎用)
2015/07/09 PHP
检测input每次的输入是否合法遇到汉字输入就有问题
2012/05/23 Javascript
jquery中使用$(#form).submit()重写提交表单无效原因分析及解决
2013/03/25 Javascript
js调用后台、后台调用前台等方法总结
2014/04/17 Javascript
JavaScript中的fontsize()方法使用详解
2015/06/08 Javascript
Js 获取、判断浏览器版本信息的简单方法
2016/08/08 Javascript
关于动态执行代码(js的Eval)实例详解
2016/08/15 Javascript
Bootstrap基本样式学习笔记之标签(5)
2016/12/07 Javascript
JS中的三个循环小结
2017/06/20 Javascript
通过构造函数实例化对象的方法
2017/06/28 Javascript
antd-mobile ListView长列表的数据更新遇到的坑
2020/04/08 Javascript
vue实现短信验证码输入框
2020/04/17 Javascript
精读《Vue3.0 Function API》
2020/05/20 Javascript
angular *Ngif else用法详解
2020/12/15 Javascript
[40:19]2018完美盛典CS.GO表演赛
2018/12/17 DOTA
linux系统使用python获取内存使用信息脚本分享
2014/01/15 Python
Python实现的查询mysql数据库并通过邮件发送信息功能
2018/05/17 Python
Python根据文件名批量转移图片的方法
2018/10/21 Python
python opencv 二值化 计算白色像素点的实例
2019/07/03 Python
Python日志处理模块logging用法解析
2020/05/19 Python
Restful_framework视图组件代码实例解析
2020/11/17 Python
HTML5 video视频字幕的使用和制作方法
2018/05/03 HTML / CSS
法国二手MacBook销售网站:Okamac
2019/03/18 全球购物
北欧最好的童装网上商店:Babyshop
2019/09/15 全球购物
什么叫应用程序域?什么是托管代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别作何解释?
2012/05/23 面试题
法律专业个人实习自我鉴定
2013/09/23 职场文书
优秀班主任事迹材料
2014/12/16 职场文书
建国大业观后感800字
2015/06/01 职场文书
女方家长婚礼答谢词
2015/09/29 职场文书
《自己的花是让别人看的》教学反思
2016/02/19 职场文书
Python中requests做接口测试的方法
2021/05/30 Python
Win11如何设置右键单击显示所有选项?Win11右键单击显示所有选项设置教程
2022/04/08 数码科技
vue判断按钮是否可以点击
2022/04/09 Vue.js