JS 执行 – 承诺

是一种异步编程的解决方案,比传统的解决方案——回调和事件更合理、更强大。最早由社区提出并实现,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 语句按顺序执行,无法取消

减少嵌套

不能抛出内部错误

© 版权声明
THE END
喜欢就支持一下吧
点赞248 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片