私有云网站建设,小程序排名三大公司,稳重大气的建筑公司名字,推广网站建设花费得多少钱Promise 简单说就是一个容器#xff0c;里面保存着某个未来才会结束的事件#xff08;通常是一个异步操作#xff09;的结果。 语法上#xff1a; Promise 是一个对象#xff0c;从它可以获取异步操作的消息。 特点
对象的状态不受外界影响。Promise 对象戴白哦一个异步操…Promise 简单说就是一个容器里面保存着某个未来才会结束的事件通常是一个异步操作的结果。 语法上 Promise 是一个对象从它可以获取异步操作的消息。 特点
对象的状态不受外界影响。Promise 对象戴白哦一个异步操作由三种状态pending(进行中)fulfilled(已成功), rejected以失败。只有异步操作的结果可以决定当前是哪一种状态。其他操作无法改变这个状态。一旦状态改变就不会再变一直保存这个结果resolved-已定型任何时候都可以得到这个结果两种可能-从pending变为fulfilled 和从 pending变为rejected。如果改变发生后再对promise对象添加回调函数也会立即得到这个结果
缺点
一旦新建Promise就会立即执行无法中途取消如果不设置回调函数Promise内部抛出的错误不会反应到外部。当处于pending状态时无法得知母亲进行到那个阶段刚开始还是将完成
Promise.resolve() resolve函数的作用是将Promise对象的状态从“未完成”变为“成功”,在异步操作成功时调用并将异步操作的结果作为参数传递出去 Promise.resolve(foo)
// 等价于
new Promise(resolve resolve(foo))Promise.resolve方法的参数分成四种情况 如果参数是 Promise 实例那么Promise.resolve将不做任何修改、原封不动地返回这个实例。 thenable对象指的是具有then方法的对象Promise.resolve方法会将这个对象转为 Promise 对象然后就立即执行thenable对象的then方法。 let thenable {then: function(resolve, reject) {resolve(42);}
};
let p1 Promise.resolve(thenable);
p1.then(function(value) {console.log(value); // 42
});如果参数是一个原始值或者是一个不具有then方法的对象则Promise.resolve方法返回一个新的 Promise 对象状态为resolved。 const p Promise.resolve(Hello);
p.then(function (s){console.log(s)
});
// HelloPromise.resolve()方法允许调用时不带参数直接返回一个resolved状态的 Promise 对象。
Promise.reject()
基本用法 resolve函数的作用是将Promise对象的状态从“未完成”变为“成功”,在异步操作成功时调用并将异步操作的结果作为参数传递出去 reject函数的作用是将Promise对象的状态从“未完成”变为“失败”即从 pending 变为 rejected在异步操作失败时调用并将异步操作报出的错误作为参数传递出去。 then方法可以接受两个回调函数作为参数。第一个回调函数是Promise对象的状态变为resolved时调用第二个回调函数是Promise对象的状态变为rejected时调用。其中第二个函数是可选的不一定要提供。这两个函数都接受Promise对象传出的值作为参数。 Promise实例的状态变为resolved就会触发then方法绑定的回调函数。 Promise 新建后就会立即执行。
Promise.prototype.then() then方法是定义在原型对象,作用是为 Promise 实例添加状态改变时的回调函数。 then方法返回的是一个新的Promise实例,可以采用链式写法 第一个回调函数完成以后会将返回结果作为参数传入第二个回调函数。 采用链式的then可以指定一组按照次序调用的回调函数。这时前一个回调函数有可能返回的还是一个Promise对象即有异步操作这时后一个回调函数就会等待该Promise对象的状态发生变化才会被调用。
Promise.prototype.catch() 指定发生错误时的回调函数。 如果 Promise 状态已经变成resolved再抛出错误是无效的。因为 Promise 的状态一旦改变就永久保持该状态不会再变了。Promise 对象的错误具有“冒泡”性质会一直向后传递直到被捕获为止。也就是说错误总是会被下一个catch语句捕获。般来说不要在then()方法里面定义 Reject 状态的回调函数,建议总是使用catch()方法而不使用then()方法的第二个参数。理由是第二种写法可以捕获前面then方法执行中的错误如果没有使用catch()方法指定错误处理的回调函数Promise 对象抛出的错误不会传递到外层代码即不会有任何反应。如果没有使用catch()方法指定错误处理的回调函数Promise 对象抛出的错误不会传递到外层代码即不会有任何反应。但是不会退出进程、终止脚本执行2 秒之后还是会输出123。这就是说Promise 内部的错误不会影响到 Promise 外部的代码通俗的说法就是“Promise 会吃掉错误”。
const someAsyncThing function() {return new Promise(function(resolve, reject) {// 下面一行会报错因为x没有声明resolve(x 2);});
};
someAsyncThing().then(function() {console.log(everything is great);
});
setTimeout(() { console.log(123) }, 2000);
// Uncaught (in promise) ReferenceError: x is not defined
// 123Node.js 有一个unhandledRejection事件专门监听未捕获的reject错误上面的脚本会触发这个事件的监听函数可以在监听函数里面抛出错误。Node.js 有一个unhandledRejection事件专门监听未捕获的reject错误上面的脚本会触发这个事件的监听函数可以在监听函数里面抛出错误。
process.on(unhandledRejection, function (err, p) {throw err;
});Promise.prototype.finally()
不管 Promise 对象最后状态如何都会执行的操作。
finally方法的回调函数不接受任何参数
Promise.all()
Promise.all()方法用于将多个 Promise 实例包装成一个新的 Promise 实例
const p Promise.all([p1, p2, p3]);接受一个Promise对象数组作为参数,如果不是就会先调用下面讲到的Promise.resolve方法将参数转为 Promise 实例再进一步处理。 Promise.all()方法的参数可以不是数组但必须具有 Iterator 接口且返回的每个成员都是 Promise 实例。
p的状态由p1、p2、p3决定分成两种情况。
只有p1、p2、p3的状态都变成fulfilledp的状态才会变成fulfilled此时p1、p2、p3的返回值组成一个数组传递给p的回调函数。只要p1、p2、p3之中有一个被rejectedp的状态就变成rejected此时第一个被reject的实例的返回值会传递给p的回调函数。 如果作为参数的 Promise 实例自己定义了catch方法那么它一旦被rejected并不会触发Promise.all()的catch方法。 上面代码中p1会resolvedp2首先会rejected但是p2有自己的catch方法该方法返回的是一个新的 Promise 实例p2指向的实际上是这个实例。该实例执行完catch方法后也会变成resolved导致Promise.all()方法参数里面的两个实例都会resolved因此会调用then方法指定的回调函数而不会调用catch方法指定的回调函数。 如果p2没有自己的catch方法就会调用Promise.all()的catch方法。
Promise.race() 将多个 Promise 实例包装成一个新的 Promise 实例。 const p Promise.race([p1, p2, p3]);只要p1、p2、p3之中有一个实例率先改变状态p的状态就跟着改变。那个率先改变的 Promise 实例的返回值就传递给p的回调函数。
Promise.race([11,2,3]).then((a,b,c) {console.log(a,b,c)//1,undefined,undefined}).then((a,b,c) {console.log(a,b,c,res---)})
Promise.allSettled()
Promise.allSettled()方法接受一组 Promise 实例作为参数包装成一个新的 Promise 实例。只有等到所有这些参数实例都返回结果不管是fulfilled还是rejected包装实例才会结束。
该方法返回的新的 Promise 实例一旦结束状态总是fulfilled不会变成rejected。状态变成fulfilled后Promise 的监听函数接收到的参数是一个数组每个成员对应一个传入Promise.allSettled()的 Promise 实例。
const resolved Promise.resolve(42);
const rejected Promise.reject(-1);
const allSettledPromise Promise.allSettled([resolved, rejected]);
allSettledPromise.then(function (results) {console.log(results);
});
// [
// { status: fulfilled, value: 42 },
// { status: rejected, reason: -1 }
// ]Promise.any()
只要参数实例有一个变成fulfilled状态包装实例就会变成fulfilled状态如果所有参数实例都变成rejected状态包装实例就会变成rejected状态。
Promise.any()跟Promise.race()方法很像只有一点不同就是不会因为某个 Promise 变成rejected状态而结束。