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中void(0)的具体含义解释
Feb 27 Javascript
让iframe自适应高度(支持XHTML,支持FF)
Jul 24 Javascript
从父页面读取和操作iframe中内容方法
Jul 25 Javascript
javascript自然分类法算法实现代码
Oct 11 Javascript
javaScript arguments 对象使用介绍
Oct 18 Javascript
基于jQuery实现下拉框
Nov 24 Javascript
JavaScript中window.open用法实例详解
Apr 15 Javascript
jquery实现简单的无缝滚动
Apr 15 Javascript
微信公众平台开发教程(六)获取个性二维码的实例
Dec 02 Javascript
详解Vue中数组和对象更改后视图不刷新的问题
Sep 21 Javascript
ES11新增的这9个新特性,你都掌握了吗
Oct 15 Javascript
js观察者模式的弹幕案例
Nov 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
php组合排序简单实现方法
2016/10/15 PHP
实例讲解php将字符串输出到HTML
2019/01/27 PHP
PHP应用跨时区功能的实现方法
2019/03/21 PHP
PHP sdk实现在线打包代码示例
2020/12/09 PHP
初学Javascript的一些总结
2008/11/03 Javascript
Extjs列表详细信息窗口新建后自动加载解决方法
2010/04/02 Javascript
jQuery ajax cache缓存问题
2010/07/01 Javascript
JS+CSS实现的拖动分页效果实例
2015/05/11 Javascript
jQuery实现表格行上下移动和置顶效果
2015/06/05 Javascript
jquery表格datatables实例解析 直接加载和延迟加载
2016/08/12 Javascript
JavaScript实现的鼠标响应颜色渐变效果完整实例
2017/02/18 Javascript
js+canvas实现动态吃豆人效果
2017/03/22 Javascript
JS表格组件神器bootstrap table使用指南详解
2017/04/12 Javascript
微信小程序中显示html格式内容的方法
2017/04/25 Javascript
使用prop解决一个checkbox选中后再次选中失效的问题
2017/07/05 Javascript
浅谈Vue数据绑定的原理
2018/01/08 Javascript
解决vue中对象属性改变视图不更新的问题
2018/02/23 Javascript
angularjs中$http异步上传Excel文件方法
2018/02/23 Javascript
webpack项目调试以及独立打包配置文件的方法
2018/02/28 Javascript
vue-cli3+typescript初体验小结
2019/02/28 Javascript
javascript中数组的常用算法深入分析
2019/03/12 Javascript
numpy中实现ndarray数组返回符合特定条件的索引方法
2018/04/17 Python
Python面向对象程序设计OOP深入分析【构造函数,组合类,工具类等】
2019/01/05 Python
python卸载后再次安装遇到的问题解决
2019/07/10 Python
python 并发编程 非阻塞IO模型原理解析
2019/08/20 Python
Python之Numpy的超实用基础详细教程
2019/10/23 Python
详解BeautifulSoup获取特定标签下内容的方法
2020/12/07 Python
服装设计师求职信
2014/06/04 职场文书
计划生育证明书写要求
2014/09/17 职场文书
海南召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
廉洁自律心得体会2016
2016/01/13 职场文书
公司年会主持词范文!
2019/05/07 职场文书
写给汽车4S店的创业计划书,拿来即用!
2019/08/09 职场文书
导游词之黄果树瀑布
2019/09/20 职场文书
SQLServer2019 数据库环境搭建与使用的实现
2021/04/08 SQL Server
动画电影《擅长捉弄人的高木同学》6月10日上映!
2022/03/20 日漫