一、Promise语法:
let promise = new Promise(function(resolve, reject) {
// executor
});
创建Promise时需要传入函数executor(执行器)作为参数
该函数的两个参数通常都命名为resolve
和reject
resolve(value)
———— 任务成功并带有结果valuereject(error)
———— 失败并带有error对象
总结:executor 会自动运行并尝试执行一项工作。尝试结束后,如果成功则调用 resolve,如果出现 error 则调用 reject。
ps.新建Promise时不传入函数会报错
二、Promise属性
有两个属性 state
和result
1.state(状态)
promise是一个有状态的对象
必然处于以下三个状态之一:
- pending
- resolved
- rejected
state — 最初是 “pending”,然后在 resolve 被调用时变为 “fulfilled”,或者在 reject 被调用时变为 “rejected”。
let p1 = new Promise((resolve,reject)=>{});
console.log(p1); // Promise <pending>
let p2 = new Promise((resolve,reject)=>{
resolve();
});
console.log(p2); // Promise <fulfilled>
promise状态一经改变,不会再变,Promise对象的状态改变,只有两种可能:
1.从pending变为fulfilled
2.从pending变为rejected。
let p = new Promise((resolve,reject)=>{
reject();
resolve(); // 无效
});
console.log(p); // Promise <rejected>
//Uncaught (in promise) undefined 未处理错error会报错但不影响
2.result(结果)
最初是 undefined,然后在 resolve(value) 被调用时变为 value,或者在 reject(error) 被调用时变为 error。
executor最终将Promise
转移至以下状态之一
state
和result
属性是内部的,无法直接访问他们,但是可以使用.then/.catch/.finally 方法
三、Promise 方法
1 .then
为Promise添加处理程序的主要方法,then()方法最多接受两个参数,两个参数都为函数:
onResolved 处理程序和 onRejected 处理程序
- onResolve函数在Promise resolved后运行并接受结果
- onRejected函数在Promise rejected后运行并接受 error
let promise = new Promise(function(resolve, reject) {
setTimeout(() => resolve("done!"), 1000);
});
// resolve 运行 .then 中的第一个函数
promise.then(
result => alert(result), // 1 秒后显示 "done!"
error => alert(error) // 不运行
);
如果只对成功的情况感兴趣,可以给.then 只提供一个函数参数:
let promise = new Promise(resolve => {
setTimeout(() => resolve("done!"), 1000);
});
promise.then(alert); // 1 秒后显示 "done!"
如果只想处理错误,则必须写成:
promise.then(null,f)
2 .catch
.catch是语法糖,之接收一个参数
.catch(f) == .then(null,f) 完全等价
3.finally()
.finally(f)用于添加onFinally处理程序,f 总是在promise被settled时运行:即promise被resolve或reject,可以避免.then的处理程序中出现冗余的代码
finally处理程序将结果和error传递给下一个处理程序:
new Promise((resolve, reject) => {
throw new Error("error");
})
.finally(() => alert("Promise ready"))
.catch(err => alert(err)); // <-- .catch 对 error 对象进行处理
//alert两次 : 1.Promise ready 2.Error:error
此处将error传递了下去,并没有处理Promise的结果