运行环境
node7以上支持此方法
chrome55以上支持此特性,一般我们用于node开发中
async简介
async其实是promise的语法糖,被async标记过的方法,返回promise对象
async的定义如下:
async function name([param[, param[, ... param]]]) { statements }
返回AsyncFunction
个人理解为就是一个promise实例
当这个 async 函数返回一个值时,Promise 的 resolve 方法将会处理这个值;当 async 函数抛出异常时,Promise 的 reject 方法将处理这个异常值。
await简介
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<leni;i++){
for(let j=0,lenj=RESOURCE_ARRAY.length;j<lenj;j++){
var obj={}
wsInstance.send(JSON.stringify(obj));
await sendResult(obj);
}
}
return true
}
/**
* 发送结果
* @param {object} 发送的结果
*/
function sendResult(obj){
let timeStep=randomInterval(1000,4000);
return new Promise(resolve => {
setTimeout(() => {
obj['result'] = getResult();
wsInstance.send(JSON.stringify(obj));
resolve("OK");
}, timeStep);
});
}
参考资料
理解 JavaScript 的 async/await
MDN async标记说明
MDN await标记说明