async
和await
使用我的理解:在每个函数前面的都加上async
,函数内部,若是是异步操做,直接在其前面加上await
便可,等待一步函数执行的结果。await
后面能够接任何变量,能够是常量或者promise
。async
修饰的函数自动变成一个promise
.正常状况下,await命令后面是一个 Promise 对象。若是不是,会被转成一个当即resolve的 Promise 对象。c#
//通过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); }