是一种异步编程的解决方案,比传统的解决方案——回调和事件更合理、更强大。最早由社区提出并实现,ES6将其写入语言标准,统一使用,原生提供对象。
特征对象的状态不受外界影响(3种状态)一旦状态改变,就不会再次改变(两种状态改变:成功或失败)用于创建实例
var promise = new Promise(function(resolve, reject){
// ... some code
if (/* 异步操作成功 */) {
resolve(value);
} else {
reject(error);
}
})
构造函数接受一个函数作为参数,其两个参数是 和 。它们是两个功能,由引擎提供,无需自己部署。
函数是将对象的状态从“未完成”变为“成功”js 语句按顺序执行,即->,在异步操作成功时调用,将异步操作的结果作为参数传递并且功能是将对象的状态从“”变为“”,又名->,在异步操作失败时调用,将异步操作的结果作为参数传递。
然后
实例生成后,可以通过then方法分别指定两个状态回调参数。 then 方法接受两个回调函数作为参数:
对象状态改变时调用(必填)对象状态改变时调用(可选)基本用法示例
function sleep(ms) {
return new Promise(function(resolve, reject) {
setTimeout(resolve, ms);
})
}
sleep(500).then( ()=> console.log("finished"));
这段代码定义了一个函数 sleep。调用后,then中的函数等待指定参数(500)ms)后执行。值得注意的是,它会在创建后立即执行。
执行顺序
接下来,我们来探索一下它的执行顺序,看看下面的代码:
let promise = new Promise(function(resolve, reject){
console.log("AAA");
resolve()
});
promise.then(() => console.log("BBB"));
console.log("CCC")
// AAA
// CCC
// BBB
执行后,我们发现输出顺序始终是AAA -> CCC -> BBB。表示创建后会立即执行,所以先输出AAA。然后,then方法指定的回调函数,直到当前脚本的所有同步任务都执行完毕,才会执行,所以最终输出BBB。
与定时器混合
先看一个例子:
let promise = new Promise(function(resolve, reject){
console.log("1");
resolve();
});
setTimeout(()=>console.log("2"), 0);
promise.then(() => console.log("3"));
console.log("4");
// 1
// 4
// 3
// 2
可以看到,结果的输出顺序始终是:1 -> 4 -> 3 -> 2。1和4的顺序不用多说,2和3输出then先,然后输出定时器任务。原因是它属于引擎内部任务,但是浏览器API,并且引擎内部任务的优先级高于浏览器API的任务,所以才有这个结果。
扩展异步/
顾名思义,异步。 async函数对函数的改进,async函数必须返回,我们可以认为所有返回的函数都是异步函数。特点体现在以下四点:
等待
顾名思义,等等。通常,await 命令后跟一个对象,该对象返回该对象的结果。如果不是对象,则直接返回对应的值。还有一种情况,await命令后面跟着一个对象(也就是定义了then方法的对象),那么await会将其等同于对象。
混合使用
先看例子:
function sleep(ms) {
return new Promise(function(resolve, reject) {
setTimeout(resolve,ms);
})
}
async function handle(){
console.log("AAA")
await sleep(5000)
console.log("BBB")
}
handle();
// AAA
// BBB (5000ms后)
我们定义了函数 sleep,它返回一个。然后在函数前加上 async 关键字来定义一个异步函数。在这个函数中,使用 await 等待一个。
优点和缺点
解决回调
无法监控进度
链式调用
New 立即执行js 语句按顺序执行,无法取消
减少嵌套
不能抛出内部错误
暂无评论内容