ES6新特性 Promise 迷南。 2022-02-20 15:32 173阅读 0赞 ## ref ## [link: JS计时事件][link_ JS] setTimeout(handler, ?timeout, ...arguments) setInterval(handler, ?timeout, ...arguments) ## `Promise` intro ## `Promise`是JS异步编程的一种解决方案。 `Promise`对象可以表示一个异步操作的最终状态(完成或失败),以及该异步操作的结果值。 * 三种状态 对象状态不受外界影响。`Promise`对象代表一个异步操作,有三种状态: * `pending`: 悬而未决的,待定的。初始状态。 * `fulfilled`: 操作成功。 * `rejected`: 被拒绝的,即操作失败。 * 状态改变 只有异步操作的结果,可以决定当前是哪种状态,其他任何操作都无法改变这个状态(状态无法再次更改)。这也是`Promise`(承诺)的类名的由来,表示其他手段无法改变。 两种变化: * `pending` \-> `fulfilled` * `pending` \-> `rejected` `Promise`与事件`Event`的区别是:事件`Event`如果被错过,再去监听,是得不到结果的。 * 好处 使得 **嵌套的异步操作更容易书写**,从回调函数的“横向发展”改为“向下发展”(`链式调用`)。 即 **将异步操作以同步操作的流程表达出来**,避免了层层嵌套的回调函数。 * 缺点 * `Promise`无法取消,一旦创建就会立即执行,无法中途执行。 * 如果不设置对应的回调函数处理错误,在`Promise`内部抛出的错误,不会反映到外部。 * 当处于`pending`状态时,无法得知当前的进展(刚刚开始还是将要完成)。 ## API ## * 构造方法 `new Promise(function executor(resolve, reject) {...})` 如果一切正常,调用`resolve`,对应`fulfilled`状态。 否则调用`reject`。 * 原型方法(可链式操作) `p.then(?onfulfilled, ?onrejected)` 可以指定操作成功或操作失败时执行的回调。 `p.catch(?onrejected)` 指定操作失败时执行的回调。 `p.finally(?onfinally)` 最后一定会执行的回调 `p.then(onfulfilled, onrejected)` 相当于: `p.then(onfulfilled).catch(onrejected)` * 静态方法 `Promise.all(iterable)` 返回一个新的`promise`,该对象只有在`iterable`中所有的`promise`对象都操作成功的时候才会触发成功。即`&&`关系。 `Promise.race(itarable)` 当`iterable`中的任意一个子`promise`出现结果(成功,失败)后,这个结果作为新返回的`promise`的参数。 `Promise.resolve(value)` 返回一个状态由给定value决定的Promise对象 `Promise.reject(reason)` 返回一个状态为失败的Promise对象,并将给定的失败信息传递给对应的处理方法 ## demo ## `Promise`对象的原型方法`then(), catch()`等会返回`promise`对象,所以可**链式调用**。 上一个执行方法传出的返回值会作为下一个执行方法的传入参数。 var p = new Promise(function(resolve, reject) { resolve(1); }).then(function(value) { console.log(value); // 1 return value * 2; }).then(function(value) { console.log(value); // 2 // 不返回值 }).then(function(value) { console.log(value); // undefined }).catch(function(v) { console.log(v); }); 大多数浏览器不能终止的`promise`链中的`rejection`,推荐最后加上: `.catch(error => console.log(error.message));` ## Promise AJAX ## function ajax(URL) { return new Promise(function(resolve, reject) { var req = new XMLHttpRequest(); req.open("GET", URL, true); req.onload = function() { if (req.status === 200) { resolve(req.responseText); } else { reject(new Error(req.statusText)); } }; req.onerror = function() { reject(new Error(req.statusText)); }; req.send(); }); } var URL = "..."; ajax(URL).then(function onFulfilled(value) { console.log("成功:", value); }).catch(function onRejected(error) { console.log("失败", error); }); `onreject()`方法的参数通常是`Error`类型。 而`then()`方法的参数可以是常见类型,也可以是另一个`Promise`实例。 [link_ JS]: https://blog.csdn.net/wuyujin1997/article/details/88650328
相关 【ES6+】006-ES6新特性:Promise 目录 一、Promise 1、概述 2、基本使用 二、Promise封装读取文件 1、一般写法 代码实现: 运行结果: 2、Promise封装 代码实现: 淡淡的烟草味﹌/ 2023年10月05日 16:05/ 0 赞/ 20 阅读
相关 ES6新特性 文章目录 一、ECMASript 介绍 二、ES6 新特性 2.1 let、const 关键字 2.2 变量的解构赋值 ゝ一世哀愁。/ 2022年09月06日 15:27/ 0 赞/ 316 阅读
相关 es6新特性 1.let && const •都是块级作用域 •不能重复定义 •避免了变量提升 ① let命令也用于声明对象,但是作用域为局部。 ![在这里插入图片描述][ 红太狼/ 2022年03月07日 21:24/ 0 赞/ 405 阅读
相关 ES6新特性 Promise ref [link: JS计时事件][link_ JS] setTimeout(handler, ?timeout, ...arguments) set 迷南。/ 2022年02月20日 15:32/ 0 赞/ 174 阅读
相关 es6新特性 es6语法 > es6语法用起来是十分方便的,但是有些浏览器还是不支持,但是做大型项目中基本上要用到转码器(babel转码器),可以把es6语法转为es5直接使用。 T 落日映苍穹つ/ 2022年01月25日 15:30/ 0 赞/ 406 阅读
相关 ES6新特性 转:[https://www.jianshu.com/p/87008f4f8513][https_www.jianshu.com_p_87008f4f8513] co Bertha 。/ 2022年01月12日 02:19/ 0 赞/ 387 阅读
相关 ES6新特性 转自:[https://www.jianshu.com/p/87008f4f8513][https_www.jianshu.com_p_87008f4f8513] 1.con 冷不防/ 2021年12月18日 07:07/ 0 赞/ 382 阅读
相关 es6新特性 https://www.cnblogs.com/minghui007/p/8177925.html 转载于:https://www.cnblogs.com/LWWTT/p/1 野性酷女/ 2021年11月02日 14:58/ 0 赞/ 550 阅读
相关 ES6新特性 1.变量声明let和const 在ES6以前,var关键字声明变量。无论声明在何处,都会被视为声明在函数的最顶部(不在函数内即在全局作用域的最顶部)。这就是函数变量提升例如: 我会带着你远行/ 2021年10月29日 07:08/ 0 赞/ 558 阅读
相关 ES6新特性 1.声明变量的关键字:const 和 let JavaScript ES6中引入了另外两个声明变量的关键字:const和let。在ES6中,我们将很少能看到var了。 co 电玩女神/ 2021年09月17日 01:12/ 0 赞/ 544 阅读
还没有评论,来说两句吧...