var error = info => {
console.log(info)
return Promise.reject(info)
}
var success = info => {
console.log(info)
return Promise.resolve(info)
}
(async function(){
try{
await error('error msg')
}catch(e){
}
await success('success')
})()
另一种写法
var error = info => {
console.log(info)
return Promise.reject(info)
}
var success = info => {
console.log(info)
return Promise.resolve(info)
}
(async function(){
await error('error msg').catch(err=>console.log(err));
await success('success')
})()
注意:多个await命令后面的异步操作,如果不存在继发关系,最好让它们同时触发。
// 多个继发关系的demo
var getMsg = time => {
return new Promise((resolve,reject)=>{
setTimeout(()=>{
console.log(`等待${time}`)
resolve(`return msg....${time}`);
},time)
})
}
(async function foo(){
var data = await Promise.all([getMsg(500),getMsg(700)]);
console.log(data)
})()
下边的例子执行效果如上
var getMsg = time => {
return new Promise((resolve,reject)=>{
setTimeout(()=>{
console.log(`等待${time}`)
resolve(`return msg....${time}`);
},time)
})
}
(async function foo(){
// 写法二
let getMsg500 = getMsg(500);
let getMsg700 = getMsg(700);
let foo = await getMsg500;
let bar = await getMsg700;
console.log(foo,bar)
})()
ES2017 标准引入了 async 函数,使得异步操作变得更加方便。
写一个简单的实现
node中执行
node --harmony-async-await *.js
async
函数返回一个Promise
对象,可以使用then
方法添加回调函数。当函数执行的时候,一旦遇到await
就会先返回,等到异步操作完成,再接着执行函数体内后面的语句。async函数返回一个 Promise 对象。
async函数内部return语句返回的值,会成为then方法回调函数的参数。
如果
async
函数内部发生错误,promise对象会变成reject
状态,抛出的错误会被catch回掉方法捕捉到同下边的代码一样都会捕捉到错误
async函数返回的 Promise 对象,必须等到内部所有await命令后面的 Promise 对象执行完,才会发生状态改变,除非遇到return语句或者抛出错误。也就是说,只有async函数内部的异步操作执行完,才会执行then方法指定的回调函数。
await
正常情况下,await命令后面是一个 Promise 对象。如果不是,会被转成一个立即resolve的 Promise 对象。(很好理解,不做过多说明)
另一种写法
注意:多个await命令后面的异步操作,如果不存在继发关系,最好让它们同时触发。
下边的例子执行效果如上
async函数的多种实现方式
相关文档