讲解一下ES6 Promise用法

所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。

ES6 规定,Promise对象是一个构造函数,用来生成Promise实例。

概述

是异步编程的一种解决方案。

从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。

Promise 状态

状态的特点

Promise 异步操作有三种状态:pending(进行中)、fulfilled(已成功)和 rejected(已失败)。除了异步操作的结果,任何其他操作都无法改变这个状态。

Promise 对象只有:从 pending 变为 fulfilled 和从 pending 变为 rejected 的状态改变。只要处于 fulfilled 和 rejected ,状态就不会再变了即 resolved(已定型)。

const p1 = new Promise(function(resolve,reject){
   resolve('success1');
   resolve('success2');
});
const p2 = new Promise(function(resolve,reject){  
   resolve('success3');
   reject('reject');
});
p1.then(function(value){  
   console.log(value); // success1
});
p2.then(function(value){
   console.log(value); // success3
});

状态的缺点

无法取消 Promise ,一旦新建它就会立即执行,无法中途取消。

如果不设置回调函数,Promise 内部抛出的错误,不会反应到外部。

当处于 pending 状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。

then 方法

then 方法接收两个函数作为参数,第一个参数是 Promise 执行成功时的回调,第二个参数是 Promise 执行失败时的回调,两个函数只会有一个被调用。

then 方法的特点

在 JavaScript 事件队列的当前运行完成之前,回调函数永远不会被调用。

const p = new Promise(function(resolve,reject){
 resolve('success');
});

p.then(function(value){
 console.log(value);
});

console.log('first');
// first
// success

通过 .then 形式添加的回调函数,不论什么时候,都会被调用。

通过多次调用

.then

,可以添加多个回调函数,它们会按照插入顺序并且独立运行。

const p = new Promise(function(resolve,reject){
 resolve(1);
}).then(function(value){ // 第一个then // 1
 console.log(value);
 return value * 2;
}).then(function(value){ // 第二个then // 2
 console.log(value);
}).then(function(value){ // 第三个then // undefined
 console.log(value);
 return Promise.resolve('resolve');
}).then(function(value){ // 第四个then // resolve
 console.log(value);
 return Promise.reject('reject');
}).then(function(value){ // 第五个then //reject:reject
 console.log('resolve:' + value);
}, function(err) {
 console.log('reject:' + err);
});

then 方法将返回一个 resolved 或 rejected 状态的 Promise 对象用于链式调用,且 Promise 对象的值就是这个返回值。

then 方法注意点

简便的 Promise 链式编程最好保持扁平化,不要嵌套 Promise。

注意总是返回或终止 Promise 链。

const p1 = new Promise(function(resolve,reject){
 resolve(1);
}).then(function(result) {
 p2(result).then(newResult => p3(newResult));
}).then(() => p4());

创建新 Promise 但忘记返回它时,对应链条被打破,导致 p4 会与 p2 和 p3 同时进行。

大多数浏览器中不能终止的 Promise 链里的 rejection,建议后面都跟上 .catch(error => console.log(error));

原创文章,作者:晴川运维,如若转载,请注明出处:https://baike.qcidc.com/8983.html

(0)
晴川运维晴川运维
上一篇 2025年6月13日
下一篇 2025年6月13日

相关推荐

  • 详解Linux中重定向和管道

    对shell有一定了解的人都知道,管道和重定向是 Linux 中非常实用的 IPC 机制。在shell中,我们通常使用符合‘|’来表示管道,符号‘>’和‘ 重定向 系统设定的…

    Linux系统 2025年7月2日
  • Linux下使用dd命令克隆硬盘

    dd 是 Linux/UNIX 下的一个非常有用的命令,作用是用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换,本篇文章为大家演示一下使用dd命令克隆硬盘具体方法。 只拷贝…

    Linux系统 2025年6月8日
  • Linux Tee 命令使用实例

    Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。在执行Linux命令时,我们既想把输出保存到文件中,又想在屏幕上看到输出内容,那么可以用到tee…

    Linux系统 2025年6月8日
  • 快速上手Linux ptrace 的实现

    Ptrace 提供了一种父进程可以控制子进程运行,并可以检查和改变它的核心image。它主要用于实现断点调试。一个被跟踪的进程运行中,直到发生一个信号。则进程被中止,并且通知其父进…

    Linux系统 2025年6月12日
  • 2022 年 5 个新 sudo 功能

    最近的 sudo 版本增加了新的功能,使你能够观察和控制以前隐藏的问题。 当你想授予你的一些用户管理权限,同时控制和检查他们在你的系统上做什么时,你会使用 sudo。然而…

    Linux系统 2025年6月11日
  • Linux下安装并使用NMState网络管理器

    NMState 是一个网络管理器,允许你按照声明式方法配置主机。这意味着你通过一个北向的声明式 API 定义所需的配置状态,这个工具通过南向的提供者provider应用配置。 目前…

    Linux系统 2025年6月16日
  • 详解Ruby的五种变量

    Ruby支持的有五种类型的变量,分别是全局变量、实例变量、类变量、局部变量、常量、伪变量,下面为大家详细的讲解一下Ruby的五种变量。 Ruby 全局变量 全局变量以 $ 开头。未…

    Linux系统 2025年6月11日
  • 详解cron与anacron

    cron 是 linux 中运行例行性工作的一个服务,守护进程是crond,是一个用于运行计划任务如系统备份、更新等的守护进程。它适合在那些 7×24 小时不间断运行的机器如服务器…

    Linux系统 2025年6月27日
  • 服务之间调用RPC的原因是什么?

    RPC(Remote Procedure Call):远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的思想。 RPC 是一种技术思想而非一种规范…

    Linux系统 2025年7月6日
  • 数据中心备用电源系统助解决停机问题

    由于现在企业必须提供更高水平的正常运行时间,企业都开始关注数据中心备用电源。备用电源也越来越先进,管理员可以使用多种系统类型和行业标准来确保无故障运行。 根据研究机构Researc…

    Linux系统 2025年6月9日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注