一、async函数返回值都是Promise对象
二、promise.then 成功的情况 对应await
三、promise.catch 失败的情况 对应try…catch
一、async函数返回值都是Promise对象
1、返回值不是promise对象,那么新promise的状态为fullfilled,结果为返回的结果,不写return默认是 return undefined
async function test() { return 100 } const result = test() console.log(result) // 状态为fullfilled,结果为100
async function test() {} const result = test() console.log(result) // 状态为fullfilled,结果为undefined
2、返回值是promise对象,新promise的状态和结果为返回的状态和结果
async function test() { return new Promise((res, rej) => { res(100) }) } const result = test() console.log(result) // 状态为fullfilled,结果为100
同上:
async function test() { return Promise.resolve(100) } const result = test() console.log(result) // 状态为fullfilled,结果为100
async function test() { return Promise.reject() } const result = test() console.log(result) // 状态为rejected,结果为100
3、抛出异常,新promise的状态为rejected,结果为抛出的值
async function test() { throw new Error('错误') } const result = test() console.log(result) // 状态为rejected,结果为Error: 错误
二、promise.then 成功的情况 对应await
1、await表达式后跟的是promise时,
若promise状态为fullfilled:
async function test() { const p = Promise.resolve(100) p.then((res) => { console.log(res) // 100 }) const res = await p console.log(res) // 100 return res } const result = test() console.log(result) // 状态为fulfilled,结果为100,没有写return默认为return undefined
若promise状态为rejected,需要用try…catch捕获:
async function test() { const p = Promise.reject(100) try { const res = await p console.log(res) } catch (e) { console.log('err', e) // err 100 return e } } const result = test() console.log(result) // 状态为fulfilled,结果为100
2、await后跟的是其他值,将该值作为await的返回值
async function test() { const res = await 100 // 内部会封装成 await Promise.resolve(100) console.log(res) return res } const result = test() console.log(result) // 状态为fulfilled,结果为100
3、await后跟的是一个异步函数,将该函数的返回值作为await的返回值
async function fn() { return 1 } async function test() { const res = await fn() console.log(res) return res } const result = test() console.log(result) // 状态为fulfilled,结果为1
三、promise.catch 失败的情况 对应try…catch
async function test() { const data = await Promise.reject(100) console.log(data) } const s = test() // Uncaught (in promise) 100 console.log(s) // 未使用try...catch捕获,状态为rejected,结果为100 async function test1() { try { const data = await Promise.reject(100) console.log(data) } catch (e) { console.log('err', e) // err 100 return e } } const result = test1() console.log(result) // 状态为fullfilled,结果为100。catch中不写return默认是return undefined