let testAsync = async function () { // throw new Error('拋出一個錯誤~'); reject() }; testAsync().then(resolve => { console.log(`resolve: ${resolve}`); }, reject => { console.log(`reject: ${reject}`); // 狀態變化成reject的回調函數會執行,若是這裏沒有回調函數,則catch會捕獲,這就是promise的東西了 }).catch(err => { console.log(`err: ${err}`); })
async function f() { await Promise.reject('出錯了'); await Promise.resolve('hello world'); // 不會執行 } // 第二行的promise語句不會執行
await後面的異步操做出錯,那麼等同於async函數返回的 Promise 對象被reject,因此最好把await命令放在try...catch代碼塊中promise
// 第一種方式 async function f() { try { await Promise.reject('出錯了'); } catch (err) { } return await Promise.resolve('hello world'); } // 第二種當時,用catch來處理前面異步的異常狀況 async function f() { await Promise.reject('出錯了').catch(err => { console.log(err); }) return await Promise.resolve('hello world'); }
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 = [{}, {}, {}]; // 報錯 docs.forEach(function (doc) { await db.post(doc); }); }