本文最后更新于 443 天前,其中的信息可能已经有所发展或是发生改变。
ES6异步
JavaScript Promise | 菜鸟教程 (runoob.com)
ES6异步有两种实现方式如下:
Promise 对象
- 这是一个被实例化的时候就开一个线程来后台运行的对象
- 构造函数接受一个函数,这个函数接受
resolve,rejected
这两个函数类的参数,然后执行异步逻辑,当执行成功后,可以调用resolve(val)
告诉promise已经完成工作,并返回信息val;失败时调用reject(err)
,停止执行并返回信息err - 使用类方法
then
来指定完成后的操作,其接受两个函数分别作为resolve
和reject
后的处理逻辑,这两个函数传入的参数即为val
或err
。如果这些函数有返回,then
会返回它们返回的值,否则将返回这个promise本身。
async 函数与 await
- 这是ES7的内容,它提供了简化的异步,类似python了,但是无需我们手动去处理线程,事件循环等内部模型。
- 它相当于一个promise,不同的是它调用时才开始被挂到事件循环上运行。
- 它的
return
相当于resolve(val)
,同时它的返回是一个promise代表它本身 -
await
只可以在async
函数内使用,等待一个promise对象(可以是创建的或者是异步函数返回的)完成并获取返回值,即val
或者err
,因此它可以组织异步函数的顺序。
实例代码
const print = (delay, info) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log(info);
resolve("res");
}, delay * 1000);
})
}
// 等价于以下代码,注意js没有sleep函数,也不允许主线程阻塞,下面的sleep函数也只能在异步函数中有用。
// const sleep = (delay) => {
// return new Promise((resolve, reject) => setTimeout(resolve, delay * 1000))
// }
// const print = async (delay, info) => {
// await sleep(delay)
// console.log(info);
// return "res"
// }
const print = async
const main = async () => {
// 这三个是顺序执行的,先等一秒打印1,再等两秒打印2,在等3秒打印3
// 这样和普通函数有什么区别呢? 普通函数就会阻塞,但是异步函数它可以让三条语句在后台执行,直接执行下面的“start”
let res1 = await print(1, 1);
await print(2, 2);
let res3 = await print(3, 3);
console.log(res3)
return 1001
}
// const res = main()
// // 这里异步函数返回的res是一个promise,它的完成即为异步函数执行完毕,传给then的是return的值
// res.then((r) => console.log("end" + r));
// console.log("start")
const print = (delay, info) => { return new Promise((resolve, reject) => { setTimeout(() => { console.log(info); resolve("res"); }, delay * 1000); }) } // 等价于以下代码,注意js没有sleep函数,也不允许主线程阻塞,下面的sleep函数也只能在异步函数中有用。 // const sleep = (delay) => { // return new Promise((resolve, reject) => setTimeout(resolve, delay * 1000)) // } // const print = async (delay, info) => { // await sleep(delay) // console.log(info); // return "res" // } const print = async const main = async () => { // 这三个是顺序执行的,先等一秒打印1,再等两秒打印2,在等3秒打印3 // 这样和普通函数有什么区别呢? 普通函数就会阻塞,但是异步函数它可以让三条语句在后台执行,直接执行下面的“start” let res1 = await print(1, 1); await print(2, 2); let res3 = await print(3, 3); console.log(res3) return 1001 } // const res = main() // // 这里异步函数返回的res是一个promise,它的完成即为异步函数执行完毕,传给then的是return的值 // res.then((r) => console.log("end" + r)); // console.log("start")