在我们的项目中会遇到许多代码嵌套,层级调用的关系,这样会导致代码难以维护,有了Promise对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外,Promise对象提供统一的接口,使得控制异步操作更加容易。
testPromise() {
new Promise(function (*resolve*, *reject*) {
• *// resolve("调用成功");*
• reject("调用失败");
})
.then((*res*) => {
*//then 里面的值通过 resolve拿到*
alert(res);
})
.catch((*err*) => {
*// reject 会走.catch这个逻辑*
alert(err);
});
有三种状态 :
初始状态(pending):不是成功状态也不是失败状态。 执行reslove : 状态由 pending ---> fulfilled 成功状态(fulfilled): 意味着操作成功完成。 执行 reject : 状态由 pending ---> rejected 失败状态(rejected): 意味着操作失败。 他的状态是不可逆的 ,一旦执行成功就不会回到pending状态,也不会回到 rejected状态。 任何时候都可以得到这个结果。所以,Promise 对象的状态改变,只有两种可能:从 pending 变为 fulfilled 和从 pending 变为 rejected。
所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果!
如果想终止在某个执行链的位置,可以用Promise.reject(new Error())*
new Promise(function (resolve, reject) {
resolve(1);
})
// .then 默认返回的也是一个promise,如果返回的是一个普通数字类型的话,那他就相当于执行了promise的resolve方法
.then((result) => {
return new Promise(function (resolve) {
resolve(result + 1);
});
// return result + 1;
})
.then((result) => {
return result + 1;
})
.then((result) => {
// 在这里调用的是promise的静态方法,终止逻辑的执行,会走.catch
return Promise.reject(new Error(result + "失败"));
// return result + 1
})
.then((result) => {
return result + 1;
})
.catch((error) => {
alert(error);
});
},
async 和 await
async
作为一个关键字放在函数的前面,使用async修饰的函数是一个异步函数,意味着该函数的执行不会阻塞后面代码的执行,异步函数的调用跟普通函数是一样。
await
await即等待,用于等待一个Promise对象。它只能在被async修饰的函数中使用,否则会报错,它的返回值不是Promise对象而是Promise对象处理之后的结果。被await修饰的函数等需要强制等待这个函数执行后,才执行async代码块中其他的代码,而代码块之外的代码不会阻塞。
async testAsync() {
const result = await new Promise(function (reslove) {
// 在五秒之后拿到结果
setTimeout(() => {
reslove("别卷了");
}, 5000);
});
alert(result);
},
async testAsync2() {
await this.testAsync(); //由于被 async 修饰过变成了异步方法,不会阻塞底下代码的执行
alert(666);
},
\