概述:
是异步编程的一种解决方案。解决异步回调问题。
从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。
特点:
对象的状态不受外界影响。
Promise
对象代表一个异步操作,有三种状态:pending
(进行中)、fulfilled
(已成功)和rejected
(已失败)一旦状态改变,就不会再变
Promise 内部的错误不会影响到 Promise 外部的代码
缺点:
Promise 新建后就会立即执行。
如果不设置回调函数,Promise 内部抛出的错误,不会反应到外部。
当处于 pending 状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)
基本用法
const promise = new Promise(function(resolve, reject) {
if (/* 异步操作成功 */){
resolve(value);
} else {
reject(error);
}
});
promise.then(function(value) {
// success
}, function(error) {
// failure
});
promise.catch(err=>{ //reject,发生错误,别名
console.log(err);
})
如果异步操作抛出错误,状态就会变为
rejected
,就会调用catch()
方法指定的回调函数
then
方法可以接受两个回调函数作为参数。第一个回调函数是Promise
对象的状态变为resolved
时调用,第二个回调函数是Promise
对象的状态变为rejected,
异步操作抛出错误时调用。但一般来说,不要在
then()
方法里面定义 Reject 状态的回调函数(即then
的第二个参数),一般是使用catch
方法。理由是第二种写法可以捕获前面then
方法执行中的错误一般建议Promise 对象后面要跟
catch()
方法,这样可以处理 Promise 内部发生的错误。catch()
方法返回的还是一个 Promise 对象,因此后面还可以接着调用then()
方法。
Promise.resolve()方法:有时需要将现有对象转为Promise对象,Promise.resolve方法就起到这个作用
Promise.resolve等价于new Promise(resolve=>resolve('foo'));
catch
Promise.prototype.catch()
方法是.then(null, rejection)
或.then(undefined, rejection)
的别名,用于指定发生错误时的回调函数。
.then(null, (err) => console.log("rejected:", err));
then
Promise.prototype.catch()
方法是为 Promise 实例添加状态改变时的回调函数。并且该方法返回一个新的Promise
对象then 方法接收两个函数作为参数,第一个参数是 Promise 执行成功时的回调,第二个参数是 Promise 执行失败时的回调,两个函数只会有一个被调用。
自己也可以写return的返回值 返回新的其他promise或其他值;如果返回新的Promise,那么下一级.then()会在新的Promise状态改变之后执行,如果返回其它任何值,则会立刻执行下一级.then()。没有明确返回值,就相当于return undefined,仍然不会影响Promise执行,即使在里面return false也不会影响下一步,false可以直接传到下一步。
Promise.resolve()
有时需要将现有对象转为 Promise 对象,Promise.resolve()
方法就起到这个作用。
Promise.resolve('foo')
// 等价于
new Promise(resolve => resolve('foo'))
Promise.all
Promise.all()
方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。
const p = Promise.all([p1, p2, p3]);
只有p1
、p2
、p3
的状态都变成fulfilled
,p
的状态才会变成fulfilled
,此时p1
、p2
、p3
的返回值组成一个数组,传递给p
的回调函数。
只要p1
、p2
、p3
之中有一个被rejected
,p
的状态就变成rejected
,此时第一个被reject
的实例的返回值,会传递给p
的 catch
方法。
Promise.all([p1, p2, p3]): 把promise打包,扔到一个数组里面,打包完还是一个promise对象,将多个 Promise 实例,包装成一个新的 Promise 实例。
必须确保,所有的promise对象,都是resolve状态,都是成功状态
Promise.race([p1, p2, p3]): 只要有一个成功,就返回