南部县建设局网站北京建设集团网站首页
- 作者: 五速梦信息网
- 时间: 2026年03月21日 10:18
当前位置: 首页 > news >正文
南部县建设局网站,北京建设集团网站首页,wordpress简约红主题,三明建设局网站ES6 Promise 对象 一、概述 是异步编程的一种解决方案。 从语法上说#xff0c;Promise 是一个对象#xff0c;从它可以获取异步操作的消息。 Promise 状态 状态的特点 Promise 异步操作有三种状态#xff1a;pending#xff08;进行中#xff09;、fulfilled#xff08;…ES6 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 状态时无法得知目前进展到哪一个阶段刚刚开始还是即将完成。 二、基本用法 ES6 规定Promise对象是一个构造函数用来生成Promise实例。 下面代码创造了一个Promise实例。 const promise new Promise(function(resolve, reject) { // … some code if (/ 异步操作成功 /){ resolve(value); } else { reject(error); } }); Promise构造函数接受一个函数作为参数该函数的两个参数分别是resolve和reject。它们是两个函数由 JavaScript 引擎提供不用自己部署。 resolve函数的作用是将Promise对象的状态从“未完成”变为“成功”即从 pending 变为 resolved在异步操作成功时调用并将异步操作的结果作为参数传递出去reject函数的作用是将Promise对象的状态从“未完成”变为“失败”即从 pending 变为 rejected在异步操作失败时调用并将异步操作报出的错误作为参数传递出去。 Promise实例生成以后可以用then方法分别指定resolved状态和rejected状态的回调函数。 promise.then(function(value) { // success }, function(error) { // failure }); then方法可以接受两个回调函数作为参数。第一个回调函数是Promise对象的状态变为resolved时调用第二个回调函数是Promise对象的状态变为rejected时调用。这两个函数都是可选的不一定要提供。它们都接受Promise对象传出的值作为参数。 下面是一个Promise对象的简单例子。 button clickaddReturnPromise练习方法返回一个Promise实例/buttontimeout(ms){return new Promise((resolve, reject) {setTimeout(resolve, ms, done);});},addReturnPromise() {this.timeout(1000).then((value) {console.log(value);})},timeout方法返回一个Promise实例表示一段时间以后才会发生的结果。过了指定的时间ms参数以后Promise实例的状态变为resolved就会触发then方法绑定的回调函数。 Promise 新建后就会立即执行。 button clickaddPromiseSort练习执行顺序相关/buttonaddPromiseSort() {let promise new Promise(function (resolve, reject) {console.log(Promise);resolve();});promise.then(function () {console.log(resolved.);});console.log(Hi!);},上面代码中Promise 新建后立即执行所以首先输出的是Promise。然后then方法指定的回调函数将在当前脚本所有同步任务执行完才会执行所以resolved最后输出。 下面是一个用Promise对象实现的 Ajax 操作的例子。 const getJSON function(url) { const promise new Promise(function(resolve, reject){ const handler function() { if (this.readyState ! 4) { return; } if (this.status 200) { resolve(this.response); } else { reject(new Error(this.statusText)); } }; const client new XMLHttpRequest(); client.open(“GET”, url); client.onreadystatechange handler; client.responseType “json”; client.setRequestHeader(“Accept”, “application/json”); client.send(); }); return promise; }; getJSON(“/posts.json”).then(function(json) { console.log(Contents: ’ json); }, function(error) { console.error(‘出错了’, error); }); 如果调用resolve函数和reject函数时带有参数那么它们的参数会被传递给回调函数。reject函数的参数通常是Error对象的实例表示抛出的错误resolve函数的参数除了正常的值以外还可能是另一个 Promise 实例比如像下面这样。 button clickaddPPromise练习resolve函数的参数除了正常的值以外还可能是另一个 Promise 实例/buttonaddPPromise() {var p1 new Promise(function (resolve, reject) {// resolve(11);reject(xx);});var p2 new Promise(function (resolve, reject) {resolve(p1);});console.log(p2);},addPPromise() {var p1 new Promise(function (resolve, reject) {resolve(11);// reject(xx);});var p2 new Promise(function (resolve, reject) {resolve(p1);});console.log(p2);},注意这时p1的状态就会传递给p2也就是说p1的状态决定了p2的状态。如果p1的状态是pending那么p2的回调函数就会等待p1的状态改变如果p1的状态已经是resolved或者rejected那么p2的回调函数将会立刻执行。 const p1 new Promise(function (resolve, reject) { setTimeout(() reject(new Error(‘fail’)), 3000) }) const p2 new Promise(function (resolve, reject) { setTimeout(() resolve(p1), 1000) }) p2 .then(result console.log(result)) .catch(error console.log(error)) // Error: fail 上面代码中p1是一个 Promise3 秒之后变为rejected。p2的状态在 1 秒之后改变resolve方法返回的是p1。由于p2返回的是另一个 Promise导致p2自己的状态无效了由p1的状态决定p2的状态。所以后面的then语句都变成针对后者p1。又过了 2 秒p1变为rejected导致触发catch方法指定的回调函数。 注意调用resolve或reject并不会终结 Promise 的参数函数的执行。 new Promise((resolve, reject) { resolve(1); console.log(2); }).then(r { console.log®; }); // 2 // 1 上面代码中调用resolve(1)以后后面的console.log(2)还是会执行并且会首先打印出来。这是因为立即 resolved 的 Promise 是在本轮事件循环的末尾执行总是晚于本轮循环的同步任务。 一般来说调用resolve或reject以后Promise 的使命就完成了后继操作应该放到then方法里面而不应该直接写在resolve或reject的后面。所以最好在它们前面加上return语句这样就不会有意外。 new Promise((resolve, reject) { return resolve(1); // 后面的语句不会执行 console.log(2); }) 三、Promise.all方法Promise.race方法 Promise.all 方法用于将多个 Promise 实例包装成一个新的 Promise 实例。 var p Promise.all([p1,p2,p3]); Promise.all 方法接受一个数组作为参数p1、p2 都是 Promise 对象的实例。Promise.all 方法的参数不一定是数组但是必须具有 iterator 接口且返回的每个成员都是 Promise 实例。 p 的状态由 p1、p2 决定分成两种情况。 1只有p1、p2、p3的状态都变成fulfilledp的状态才会变成fulfilled此时p1、p2、p3的返回值组成一个数组传递给p的回调函数。 2只要p1、p2、p3之中有一个被rejectedp的状态就变成rejected此时第一个被reject的实例的返回值会传递给p的回调函数。 button clickaddPromiseAll练习Promise.all/buttonaddPromiseAll() {console.log(addPromiseAll);var p1 new Promise(function (resolve, reject) {resolve(66);// reject(44);});var p2 new Promise(function (resolve, reject) {resolve(55);});var p Promise.all([p1, p2]);console.log(p);p.then(function (value) {console.log(value, value);}).catch(function (reason) {console.log(reason, reason);});},button clickaddPromiseAll练习Promise.all/buttonaddPromiseAll() {console.log(addPromiseAll);var p1 new Promise(function (resolve, reject) {// resolve(66);reject(44);});var p2 new Promise(function (resolve, reject) {resolve(55);});var p Promise.all([p1, p2]);console.log(p);p.then(function (value) {console.log(value, value);}).catch(function (reason) {console.log(reason, reason);});},Promise.race 方法同样是将多个 Promise 实例包装成一个新的 Promise 实例。 var p Promise.race([p1,p2,p3]); 只要p1、p2、p3之中有一个实例率先改变状态p的状态就跟着改变。那个率先改变的Promise实例的返回值就传递给p的返回值。 如果Promise.all方法和Promise.race方法的参数不是Promise实例就会先调用下面讲到的Promise.resolve方法将参数转为Promise实例再进一步处理。 button clickaddPromiseRace练习Promise.race/buttonaddPromiseRace() {var p1 new Promise(function (resolve, reject) {resolve(11);// reject(xx);});var p2 new Promise(function (resolve, reject) {resolve(22);});var p3 new Promise(function (resolve, reject) {resolve(33);});var p Promise.race([p1, p2]);console.log(p);p.then(function (value) {console.log(value, value);}).catch(function (reason) {console.log(reason, reason);});},button clickaddPromiseRace练习Promise.race/buttonaddPromiseRace() {var p1 new Promise(function (resolve, reject) {// resolve(11);reject(xx);});var p2 new Promise(function (resolve, reject) {resolve(22);});var p3 new Promise(function (resolve, reject) {resolve(33);});var p Promise.race([p1, p2]);console.log(p);p.then(function (value) {console.log(value, value);}).catch(function (reason) {console.log(reason, reason);});},
- 上一篇: 男生女生做污事网站网站 带数据
- 下一篇: 南昌成都网站建设方案太原网站建设方案推广
相关文章
-
男生女生做污事网站网站 带数据
男生女生做污事网站网站 带数据
- 技术栈
- 2026年03月21日
-
男生和男生男生做的漫画网站关于化妆品网站成功案例
男生和男生男生做的漫画网站关于化妆品网站成功案例
- 技术栈
- 2026年03月21日
-
男人和女人做不可描述的事情的网站郑州论坛官网
男人和女人做不可描述的事情的网站郑州论坛官网
- 技术栈
- 2026年03月21日
-
南昌成都网站建设方案太原网站建设方案推广
南昌成都网站建设方案太原网站建设方案推广
- 技术栈
- 2026年03月21日
-
南昌电子商务网站建设手机网站横竖屏
南昌电子商务网站建设手机网站横竖屏
- 技术栈
- 2026年03月21日
-
南昌高端网站建设采购网有哪些平台
南昌高端网站建设采购网有哪些平台
- 技术栈
- 2026年03月21日
