一、promise
ECMAScript 6 新增的引用类型 Promise,可以通过 new 操作符来实例化。创建新期约时需要传入执行器(executor)函数作为参数。 promise有三个状态,分别是pending(执行中)、success(成功)、rejected(失败):
let n = new Promise((resolve,reject) => {
//...
resolve('123')
});
n.then(result => {
console.log(result);//123
});
无论 resolve()和 reject()中的哪个被调用,状态转换都不可撤销了。于是继续修改状态会静默 失败,如下所示:
let p = new Promise((resolve, reject) => {
resolve();
reject(); // 没有效果
});
为避免期约卡在待定状态,可以添加一个定时退出功能。比如,可以通过 setTimeout 设置一个 10 秒钟后无论如何都会拒绝期约的回调:
let p = new Promise((resolve, reject) => {
setTimeout(reject, 10000); // 10 秒后调用 reject() // 执行函数的逻辑
});
setTimeout(console.log, 0, p); // Promise <pending>
setTimeout(console.log, 11000, p); // 11 秒后再检查状态
二、async await
它可以把一个异步函数强制的处理成为一个同步函数,就很厉害,他本质也是promise,衍生出来的语法糖,写起来更优雅。async和await是配对使用的!!!!这点谨记,少任何一个都会报错。
//不加async await
function foo () {
Promise.resolve().then(resolve => {
console.log("1");
});
console.log(3);
}
foo();//3 1
//加了async await
async function foo () {
await Promise.resolve().then(resolve => {
console.log("1");
});
console.log(3);
}
foo();//1 3
3.区别
async/await 是建立在 Promises上的,不能被使用在普通回调以及节点回调
async/await相对于promise来讲,写法更加优雅
async/await 和 Promises 很像,不阻塞
async/await 代码看起来像同步代码