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); }