Js 之promise、async 和 await

一、示例代码

<html>
<head></head>
<body>

<script src="jquery.js"></script>
<script>
    const login = async function(){
        var a = await new Promise((resolve, reject) => {
            $.get("", function(res){
                resolve(res);
            }, 'json');
        });
        console.log(a);
        var b = await test2();
        return b;
    }
    
    function test2(){
        return 'test2';
    }
    
    login().then(res => {
        console.log(res);
    });
</script>
</body>
</html>

二、promise

Promise 是承诺的意思,承诺它过一段时间会给你一个结果。Promise 是一种解决异步编程的方案,相比回调函数和事件更合理和更强大。从语法上讲,promise 是一个对象,从它可以获取异步操作的消息;

promise 有三种状态:pending 初始状态也叫等待状态,fulfiled成功状态,rejected 失败状态;状态一旦改变,就不会再变。创造 promise实例后,它会立即执行。需要注意,promise 的状态是不可逆的,一旦状态由 pending 变为 fulfiled 或者reject 状态,意味着已经产生了结果,同样,转为成功状态会有成功的结果,转为失败状态会返回失败的原因。

promise 作为构造函数,接收两个参数,分别是成功和失败的回调函数。

function sleep(second) {
  return new Promise((resolve, reject) => {
    setTimeout(() => resolve(), second * 1000);
  });
}
sleep(3)
  .then(() => {
    console.log("开始执行");
    return sleep(3);
  })
  .then(() => {
    console.log("第二次执行");
    return sleep(3);
  })
  .then(() => {
    console.log("第三次执行");
  });

 

then 捕获resolve回调

catch 捕获reject状态的回调

p.then((data) => {
  console.log("resolved", data);
}).catch((err) => {
  console.log("rejected", err);
});

三、async 

async是一个加在函数前的修饰符,被async定义的函数会默认返回一个Promise对象resolve的值。因此对async函数可以直接then,返回值就是then方法传入的函数。使用如下:

async function fun() {
    console.log(1);
    return 1;
}
fun().then(val => {
    console.log(val) // 1,1
})

四、await

await 也是一个修饰符,只能放在async定义的函数内。可以理解为等待。await 修饰的如果是Promise对象:可以获取Promise中返回的内容(resolve或reject的参数),且取到值后语句才会往下执行;如果不是Promise对象:把这个非promise的东西当做await表达式的结果。使用如下:

async function fun() {
    let a = await new Promise((resolve, reject) => {
        setTimeout(function () {
            resolve('setTimeout promise')
        }, 3000)
    })
    let b = await "表达式";
    let c = await function () {
        return '函数表达式'
    }()
    console.log(a, b, c)
}
fun(); // 3秒后输出:"setTimeout promise" "表达式" "函数表达式"

 

posted @ 2023-07-31 16:39  样子2018  阅读(90)  评论(0编辑  收藏  举报