首页 > 其他分享 >【ES6】Promise对象详解

【ES6】Promise对象详解

时间:2023-01-16 17:32:45浏览次数:39  
标签:function ES6 函数 异步 对象 详解 Promise


【ES6】Promise对象详解

  • ​​一、Promise对象的含义​​
  • ​​二、Promise对象的用法​​
  • ​​三、Promise对象的几个应用【重点】​​
  • ​​1、时间延迟函数​​
  • ​​2、图片异步加载​​
  • ​​查看更多ES6教学文章:​​
  • ​​参考文献​​

引言:ES6新增的Generato、Promise、async都与异步编程有关。这里我们讲述Promise对象。


一、Promise对象的含义


所谓Promise就是一个对象,用来传递异步操作的消息。它代表了某个未来才会知道结果的事件(通常是一个异步操作),并且这个事件提供统一的 API,可供进一步处理。

  Promise对象有以下两个特点。

1.对象的状态不受外界影响。Promise对象代表一个异步操作,有3种状态: Pending( 进行中)、Resolved (已完成,又称Fulfilled)和Rejected (已失败)。只有异步操作的结果可以决定当前是哪种状态,任何其他操作都无法改变这个状态。这也是“Promise” 这个名字的由来,它在英语中意思就是“承诺”,表 示其他手段无法改变。

2.一旦状态改变就不会再变,任何时候都可以得到这个结果。Promise对象的状态改变只有两种可能:从Pending变为Resolved从Pending变为Rejected。只要其中之一发生, 状态就凝固了,不会再变,会一直保持这个结果。就算改变已经发生,再对Promise对象添加回调函数,也会立即得到这个结果。这与事件( Event)完全不同。事件的特点是,如果你错过了它,再去监听是得不到结果的。

  有了Promise对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外,Promise 对象提供统一的接口,使得控制异步操作更加容易。

  Promise也有一些缺点。首先,无法取消Promise,一旦新建它就会立即执行,无法中途取消。其次,如果不设置回调函数,Promise 内部抛出的错误不会反应到外部。再者,当处于Pending状态时,无法得知目前进展到哪一个阶段 (刚刚开始还是即将完成)。

  如果某些事件不断地反复发生,一般说来, 使用stream模式是比部署Promise更好的选择。

二、Promise对象的用法


  ES6规定,Promise 对象是一个构造函数,用来生成Promise实例。下面的代码块2-1创造了一个Promise实例。

/********   代码块2-1    ********/
var promise = new Promise(function(resolve, reject) {
//... some code
if (/*异步操作成功*/){
resolve(value);
} else
reject(error);
});


resolve函数的作用是,将Promise对象的状态从“未完成”变为“成功”(即从Pending变为Resolved),在异步操作成功时调用,并将异步操作的结果作为参数传递出去;

   reject函数的作用是,将Promise对象的状态从“未完成”变为“失败”(即从Pending变为Rejected),在异步操作失败时调用,并将异步操作报出的错误作为参数传递出去。

  Promise实例生成以后,可以用then方法分别指定Resolved 状态和Rejected状态的回调函数。见代码块2-2。

/********   代码块2-2    ********/
promise.then( function(value) {
// success
}, function(value) {
// failure
});


第一个回调函数是Promise对象的状态变为Resolved时调用,第二个回调函数是Promise 对象的状态变为Rejected 时调用。其中,第二个函数是可选的,不一定要提供。这两个函数都接受Promise对象传出的值作为参数。

三、Promise对象的几个应用【重点】

1、时间延迟函数


提出背景:我们知道setTimeout()函数可以每隔一段时间循环运行函数体。我们在编程过程中,经常会只需要循环两三次,或者在某个函数段需要停滞几秒,这时再用setTimeout就很麻烦。

  应用介绍:以下函数可延迟100ms运行。下面的代码块3-1中,timeout方法返回一个Promise实例,表示一段时间以后才会发生的结果。过 了指定的时间(ms参数)以后,Promise 实例的状态变为Resolved, 就会触发then方法绑定的回调函数。

/********   代码块3-1    ********/
function timeout(ms) {
return new Promise((resolve, reject) => {
setTimeout(resolve, ms, 'done');
});

timeout(100). then((value) => {
console. log(value);
});

2、图片异步加载



function loadImageAsync(url) {
return new Promise( function(resolve, reject) {
var image = new Image();

image.onload = function() {
resolve(image);
};

image.onerror = function() {
reject(new Error ('Could not load image at '+url);
};

image.src = url;
});
}

查看更多ES6教学文章:

​​1. 【ES6】let与const 详解​​2. 【ES6】变量的解构赋值
3. 【ES6】字符串的拓展
4. 【ES6】正则表达式的拓展
5. 【ES6】数值的拓展
6. 【ES6】数组的拓展
7. 【ES6】函数的拓展
8. 【ES6】对象的拓展
9. 【ES6】JS第7种数据类型:Symbol
10. 【ES6】Proxy对象
11. 【ES6】JS的Set和Map数据结构
12. 【ES6】Generator函数详解
13. 【ES6】Promise对象详解
14. 【ES6】异步操作和async函数
15. 【ES6】JS类的用法class
16. 【ES6】Module模块详解
17. 【ES6】ES6编程规范 编程风格

参考文献

阮一峰 《ES6标准入门(第2版)》


标签:function,ES6,函数,异步,对象,详解,Promise
From: https://blog.51cto.com/u_15942590/6010587

相关文章

  • 【ES6】JS的Set和Map数据结构
    【ES6】JS的Set和Map数据结构​​一、Set​​​​1、基本用法​​​​2、4种操作方法​​​​3、4种遍历方法​​​​4、Set的应用​​​​1)Set转化为数组​​​​2)去除数组......
  • 【ES6】Proxy对象
    【ES6】Proxy对象​​一、Proxy的基本用法​​​​二、Proxy示例的方法​​​​1)get()​​​​2)set()​​​​3)apply()​​​​查看更多ES6教学文章:​​​​参考文献​​引......
  • 【ES6】JS第7种数据类型:Symbol
    【ES6】JS第7种数据类型:Symbol​​一、Symbol的由来​​​​二、Symbol的涵义​​​​三、Symbol的判等​​​​四、Symbol的运算与转化​​​​查看更多ES6教学文章:​​​......
  • 【ES6】对象的拓展
    【ES6】对象的拓展​​一、对象的两种表示法【掌握】​​​​1)简洁表示法​​​​2)属性名表达式法​​​​二、Object.is()【了解】​​​​三、Object.assign()【了解】​......
  • Log4Net组件的应用详解
     第一步:添加并应用Log4net.dll。然后在Web.config文件中添加下面的配置局<configSections><sectionname="log4net"type="log4net.Config.Log4NetConfigurationSectionH......
  • GShang博客园主题高级版本适配教程详解
    主题预览博客Favicon自定义导航栏扩展博客内部公告信息首页轮播信息侧边栏公告信息整合博文发布信息位置调整博文侧边目录博文代码块复制博文作者信息签名博客捷径应用(更多......
  • JavaScript async/await 的用法以及它与 Promise 的区别
    async/await是JavaScript中的语法糖,用于简化异步代码的编写。它允许你在异步代码中使用同步风格的语法,使代码更易于阅读和维护。用法:使用关键字async声明一个异步......
  • ChatGPT/InstructGPT详解
    作者:京东零售刘岩​前言GPT系列是OpenAI的一系列预训练文章,GPT的全称是GenerativePre-TrainedTransformer,顾名思义,GPT的目的就是通过Transformer为基础模型,使用预训练技......
  • 神经网络基础部件-损失函数详解
    本文总结分类和回归任务的常用损失函数,比如重点解析了交叉熵损失函数的由来,并给出详细计算公式和、案例分析、代码,同时也描述了MAE和MSE损失函数,给出了详细的计算公式......
  • logging 模块详解
    日志记录函数以它们用来跟踪的事件的级别或严重性命名。下面描述了标准级别及其适用性(从高到低的顺序)日志等级(level)描述DEBUG 最详细的日志信息,典型应用场景是问......