node7 以上支持此方法
chrome55 以上支持此特性,一般我们用于 node 开发中
async 其实是 promise 的语法糖,被 async 标记过的方法,返回 promise 对象
async 的定义如下:
- async function name([param[, param[, ... param]]]) { statements }
返回 AsyncFunction 个人理解为就是一个 promise 实例
当这个 async 函数返回一个值时,Promise 的 resolve 方法将会处理这个值;当 async 函数抛出异常时,Promise 的 reject 方法将处理这个异常值。
await 一般需要配合 async 标记的函数使用
await 表达式会暂停当前 async function 的执行,等待 Promise 处理完成。
await 标记的方法调用返回的值其实就是 promise 的 resolve 方法返回的
若 Promise 正常处理 (fulfilled),其处理结果作为 await 表达式的值,继续执行 async function。
若 Promise 处理异常 (rejected),await 表达式会把 Promise 的异常原因抛出。
另外,如果 await 操作符后的表达式的值不是一个 Promise,那么该值将被转换为一个已正常处理的 Promise。
- function resolveAfter2Seconds(x) {
- return new Promise(resolve => {
- setTimeout(() => {
- resolve(x);
- }, 2000);
- });
- }
- async function add1(x) {
- var a = resolveAfter2Seconds(20);
- var b = resolveAfter2Seconds(30);
- return x + await a + await b;
- }
- add1(10).then(v => {
- console.log(v); // prints 60 after 2 seconds.
- });
- async function add2(x) {
- var a = await resolveAfter2Seconds(20);
- var b = await resolveAfter2Seconds(30);
- return x + a + b;
- }
- add2(10).then(v => {
- console.log(v); // prints 60 after 4 seconds.
- });
- async function f3() {
- try {
- //如果调用promise的reject方法,则会被异常捕获
- var z = await Promise.reject(30);
- } catch (e) {
- console.log(e); // 30
- }
- }
- f3();
今天写了一个模拟 websocket 的接口,代码中使用到了该特性,直接看 源码
- //websocket监听消息
- ws.on('message', async function (message) {
- //注意匿名函数上使用了async标记,否则报错
- var stockRequest = JSON.parse(message);//根据请求过来的数据来更新。
- console.log("收到消息", stockRequest);
- let result = await startSendMessage();
- });
- /**
- * 发送消息
- */
- async function startSendMessage(){
- for(let i=0,leni=PROVINCE_ARRAY.length;i {
- setTimeout(() => {
- obj['result'] = getResult();
- wsInstance.send(JSON.stringify(obj));
- resolve("OK");
- }, timeStep);
- });
- }
来源: https://www.2cto.com/kf/201712/703269.html