promise对象
promise含义:所谓的promise对象,中文意思为"承诺",也就是再未来你要做的事情,而在ES6中就是指在将来要执行的代码,是一种异步编程的解决方法。
- 什么是同步和异步?
- 同步:同步操作就是在执行过程中只能做一件事情,必须等到上一件事情完成后,才能继续执行下一件操作 。
- 异步: 程序员会将需要花费长时间或者等待一段时间的操作,来提高用户的体验效果,不用让用户等待很长一段时间,这些操作存放在一个任务队列中,等到主线程中的操作做完后或轮到这个操作执行再来执行这个任务队列中的操作,这样形成一个类似循环的结构,经典的异步方法是setInterval和setTimeout。
在JavaScript中是以单线程来执行运转的,而所谓的单线程就是,在执行过程中只能做一件事情,必须等到上一件事情完成后,才能继续执行下一件操作,如果执行一件操作cpu是空闲状态,这个的操作对于cpu来说是及其耗费系统资源的,降低了资源的利用率。
JavaScript的执行原理:在js执行过程中,程序会按照顺序执行的过程来进行,也就是同步进行,上一行执行完毕在进行下一行执行,过程中遇到异步操作,会将这个异步操作挂起,存放到一个任务队列中,先执行程序中的同步操作,执行完毕后再来查找这个任务队列中是否有要执行的异步操作,如果存在就将这些异步操作依次执行
promise基本用法
promise对象是一个构造函数,需要实例化来创建它,
var p1 = new Promise((resolve, reject) => {
if (true) {
resolve("success")
} else {
reject("err")
}
Promise实例生成以后,可以用then方法分别指定resolved状态和rejected状态的回调函数。
then方法可以接受两个回调函数作为参数,第一个回调函数是Promise对象的状态变为resolved时调用,第二个回调函数是Promise对象的状态变为rejected时调用。其中,第二个函数是可选的,不一定要提供。这两个函数都接受Promise对象传出的值作为参数。
p1 .then(function(value) {
// success
}, function(error) {
// failure
});
状态失败时候另一种方法:
p.then(res => {
console.log(res)
}).catch(err => { //接收失败的返回值
console.log(err)
})
.then(res=>{},err=>{})第二个回调
和.catch(err=>{})
的区别:
- catch() 是可以捕获到then里面的错误信息,(推荐使用)
- then(res=>{},err=>{})第二个回调 是捕获不到then里面的错误信息
js中可以捕获错误信息的方法
try {
aerl()
} catch (error) {
console.log(error)
}
promise基本了解
Promise 是异步编程的一种解决方案,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。
Promise对象有以下特点:
-
1. 对象的状态不受外界影响。Promise对象代表一个异步操作,有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是Promise这个名字的由来,它的英语意思就是“承诺”,表示其他手段无法改变。
-
2.一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise对象的状态改变,只有两种可能:从pending变为fulfilled和从pending变为rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果,这时就称为 resolved(已定型)。如果改变已经发生了,你再对Promise对象添加回调函数,也会立即得到这个结果。这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。
-
3.无法取消Promise,一旦新建它就会立即执行,无法中途取消
-
4.状态
const p1 = new Promise(function(resolve, reject) {}); // 进行中
const p2 = new Promise(function(resolve, reject) {
resolve(p1);
})
p2.then(res => {
console.log("p2")
})
//p1的状态决定着p2的状态
// 如果p1的状态是进行中,p2会一直在等待,如果p1是成功,p2也是成功状态
- 5.链式调用
let p = new Promise(resolve=>{resolve()})
p.then(()=>{
console.log(1)
return new Promise()
//如果要进行链式调用,return必须是一个promise对象
}).then(()=>{
})
要注意的是ajax请求成功和失败,与promise的成功状态和失败状态是两回事
例如:实现登陆功能时,用户输入的账号和密码会通过ajax请求查找数据库中是否存在这个用户信息,如果此时登陆失败,也就是说ajax请求成功在数据库中没有查找到这个用户信息返回一个值,与promise的成功和失败没有关系
promise的常用方法
- promise.all()方法用于将多个 Promise 实例,包装成一个新的 Promise 实例
const p = Promise.all([p1, p2, p3]);
Promise.all()
方法接受一个数组作为参数,p1、p2、p3都是 Promise 实例
- promise.race()方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例
const p = Promise.race([p1, p2, p3]);
只要p1、p2、p3之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给p的回调函数。
- promise.prototype.finally()
方法用于指定不管 Promise 对象最后状态如何,都会执行的操作。该方法是 ES2018 引入标准的.
promise
.then(result => {···})
.catch(error => {···})
.finally(() => {···});
不管promise最后的状态,在执行完then或catch指定的回调函数以后,都会执行finally方法指定的回调函数
finally方法的回调函数不接受任何参数,这意味着没有办法知道,前面的 Promise 状态到底是fulfilled还是rejected。这表明,finally方法里面的操作,应该是与状态无关的,不依赖于 Promise 的执行结果