异步函数,又称“async/await”(语法关键字),是ES6Promise模式在ECMAScript函数中的应用。async/await是ES8规范的新特性。此功能在行为和语法上增强了JavaScript,允许同步编写的代码异步执行。我们看一个最简单的例子,这个Promise超时后会被处理成一个值:letp=newPromise((resolve,reject)=>setTimeout(resolve,1000,3));这个Promise将在1000毫秒后被处理,值为3。如果程序中的其他代码想要在可用时访问这个值,则需要编写一个resolvehandler:letp=newPromise((resolve,reject)=>设置超时(解决,1000,3));p.then((x)=>console.log(x));//3这其实很不方便,因为其他代码必须放在Promisehandler中。但是您可以将处理程序定义为函数:functionhandler(x){console.log(x);}letp=newPromise((resolve,reject)=>setTimeout(resolve,1000,3));p.then(handler);//3这个提升其实并没有那么大。这是因为任何需要访问此Promise产生的值的代码都需要以处理程序的形式接收此值。换句话说,代码仍然必须放在处理程序中。ES8提供了async/await关键字来声明一个异步函数,可以在所有的函数声明中使用//在函数声明中asyncfunctionfoo(){}//在函数表达式中letbar=asyncfunction(){};//在箭头函数中letbaz=async()=>{};//类classPerson{asyncsleep(){}}中的方法使用async关键字可以使函数异步,但整体代码仍然是同步计算。但是,异步函数在参数或闭包方面仍然具有普通JavaScript函数的正常行为。如以下示例所示,foo()函数仍将在以下指令之前进行评估asyncfunctionfoo(){console.log(1);}foo();console.log(2);//1//2但是,如果异步函数使用return关键字返回一个值(如果没有return则返回undefined),这个值将被Promise.resolve()包装成一个合约对象。异步函数总是返回Promise对象。在函数外调用这个函数可以获得它返回的Promise:asyncfunctionfoo(){console.log(1);return3;}//给返回的Promise添加一个resolutionhandlerfoo().then(console.log);console.log(2);//1//2//3当然直接返回一个Promise对象是相同:异步函数foo(){console.log(1);返回Promise.resolve(3);}//向返回的Promise添加解析处理程序foo().then(console.log);console.log(2);//1//2//3
