ES2017 中的异步函数详解(async function)
Posted 做人要厚道2013
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ES2017 中的异步函数详解(async function)相关的知识,希望对你有一定的参考价值。
异步函数中有两个新的关键字async
和await
async
就是异步的意思
await
就是等的意思. 暂停函数的执行, 等待异步任务完成.
声明异步函数
/*使用关键字 async 声明异步函数. 参数声明和普通函数没有任何的区别*/
async function testAsync(a, b)
console.log(a, b);
return "异步";
/*调用异步函数, 返回值是一个 Promise 对象*/
var promise = testAsync(10, 20);
console.log(promise);
说明:
使用关键字
async
声明异步函数异步函数默认返回一个已决的
promise
.也可以在异步函数中添加
return "abc"
语句, 则会把这个值封装成Promise.resolve("abc")
如果想返回一个
reject
的Promise
则可以在函数内部抛出一个异常即可.
await
如果异步函数内没有出现await
则上面的异步函数和一个普通的函数没有太大的区别.
如果有了await
则会大大的不一样.
await
是等待的意思, 到底在等啥?
在等待一个异步任务的完成. 一般是等待一个 Promise resolve. 当然可以等任何其他的值.
function resolve2Second(x)
return new Promise(function (resolve, reject)
setTimeout(() => resolve(x), 2000);
)
async function add()
var a = await resolve2Second(20); // 2 秒钟之后 a为 20
var b = await resolve2Second(30); // 2 秒钟之后 b为30
return a + b; //
add().then(function (value) // 4s中之后, 返回的promsie 会变成已决状态, 执行then中的函数
console.log(value); // 50
)
说明:
await
会等待, 等到Promise resolve
之后, 他的运算的最终结果是resolve(值)
中的值.有一点需要注意的时候,
await
只能在异步函数内执行.- 调用
async
函数虽然有等待, 但是并不会导致阻塞, 因为他内部的所有阻塞都封装在Promise
对象中异步执行.
异步函数的优势在哪里
需求:
考虑有多个任务, 每个任务都依赖上一个任务的结果. 用setTimeout
来模拟每个任何的耗时.
使用单纯的Promise
来完成
/*n表示耗时, n+1000传给下个任务*/
function doSomething(n)
return new Promise((resolve, reject) =>
setTimeout(() => resolve(n + 1000), n)
)
function task1(n)
console.log("任务1:" + n)
return doSomething(n);
function task2(n)
console.log("任务2:" + n)
return doSomething(n);
function task3(n)
console.log("任务3:" + n)
return doSomething(n);
function doit()
task1(1000)
.then(function (time2)
return task2(time2);
)
.then(function (time3)
return task3(time3);
)
.finally(function ()
console.log("任务结束");
)
doit();
使用 async
和await
如果使用异步函数配合await
会发现代码像同步一样舒服.
/*n表示耗时, n+1000传给下个任务*/
function doSomething(n)
return new Promise((resolve, reject) =>
setTimeout(() => resolve(n + 1000), n)
)
function task1(n)
console.log("任务1:" + n)
return doSomething(n);
function task2(n)
console.log("任务2:" + n)
return doSomething(n);
function task3(n)
console.log("任务3:" + n)
return doSomething(n);
async function doit()
var time2 = await task1(1000) // 等待第一个任务 resolve
var time3 = await task2(time2) // 等待第二个任务 resolve
var result = await task3(time3)
console.log("任务结束:" + result);
doit();
以上是关于ES2017 中的异步函数详解(async function)的主要内容,如果未能解决你的问题,请参考以下文章