摘自
关于async
和await
使用
个人理解:在每一个函数前面的都加上async
,函数内部,如果是异步操作,直接在其前面加上await
即可,等待一步函数执行的结果。await
后面可以接任何变量,可以是常量或者promise
。async
修饰的函数自动变成一个promise
.正常情况下,await命令后面是一个 Promise 对象。如果不是,会被转成一个立即resolve的 Promise 对象。
//经过async修饰之后,自动变成promise对象async function f() { return 'hello world';}f().then(v => console.log(v))// "hello world"async function f() { return await 123;}f().then(v => console.log(v))// 123
//错误处理 async function f() { throw new Error('出错了');}f().then( v => console.log(v), e => console.log(e))// Error: 出错了
async
中错误处理
//使用catch捕捉错误async function f() { await Promise.reject('出错了');}f().then(v => console.log(v)).catch(e => console.log(e))// 出错了
async function main() { try { var val1 = await firstStep(); var val2 = await secondStep(val1); var val3 = await thirdStep(val1, val2); console.log('Final: ', val3); } catch (err) { console.error(err); }}
//使用async控制指定时间打印function timeout(ms) { return new Promise((resolve) => { setTimeout(resolve, ms); });}async function asyncPrint(value, ms) { await timeout(ms); console.log(value)}asyncPrint('hello world', 50);
多种形式
const foo = async function(){}async function foo(){}const foo = async () => {};
并发处理
let foo = await getFoo();let bar = await getBar();//======================// 写法一let [foo, bar] = await Promise.all([getFoo(), getBar()]);// 写法二let fooPromise = getFoo();let barPromise = getBar();let foo = await fooPromise;let bar = await barPromise;//使用下面的方式是,使一步操作同时触发。最上面的方式是同步执行。//并发执行的方式选择async function dbFuc(db) { let docs = [{}, {}, {}]; let promises = docs.map((doc) => db.post(doc)); let results = await Promise.all(promises); console.log(results);}// 或者使用下面的写法//使用for循环控制了使用await的时间async function dbFuc(db) { let docs = [{}, {}, {}]; let promises = docs.map((doc) => db.post(doc)); let results = []; for (let promise of promises) { results.push(await promise); } console.log(results);}