async-await
async-await
const _async = (func) => {
const p = new Promise((resolve, reject) => {
try {
const value = func()
if (((typeof value === 'object' && value !== null) || typeof value === 'function') &&
typeof value.then === 'function') {
Promise.resolve(value).then(resolve, reject)
} else {
resolve(value)
}
} catch (error) {
reject(error)
}
})
return p
}
const _await = (arg) => (onResolved, onRejected) => {
const innerPromise = onRejected ? Promise.resolve(arg).catch(onRejected).then(onResolved, onRejected)
: Promise.resolve(arg).then(onResolved, onRejected)
return innerPromise
}
module.exports = {
_async,
_await
}
async-await-comment
/*
async await 是promise的语法糖,优化promise的then链写法,用同步的方式编写异步代码
async 异步函数(包含函数声明、函数表达式、Lambda表达式[箭头函数]等使用形式)
1. 返回一个 Promise 对象
1. 直接返回成功或失败状态的promise
1.1 函数体没有await,return 一个普通值(非promise和thenable对象,默认undefined),async立刻返回一个成功状态的promise,值为该普通值
1.2 函数体中没有await或在await之前,抛出异常,async立即返回失败的promise,值为失败原因,异常不会抛到函数体外面影响外面代码的执行
2. 先返回PENDING状态的promise,然后再异步修改状态
2.1 函数体中有await,在await获取到值之前,async先返回 PENDING 状态的promise,然后再根据await后面表达式返回promise的状态而改变
2.2 如果await后面表达式返回的promise失败且未捕获异常,则async返回的promise失败,失败原因是表达式返回promise的失败原因
2. 最外层async无法用 await 获取其返回值,应该用原来的方式:then() 链来处理async返回的 promise 对象
await 表达式(包含promise对象,普通函数调用、基本值类型)
1. 【等待】表达式的【返回值】
1.1 如果表达式的值是promise对象,则等待promise返回(调用其then方法,异步获取),并将其返回值作为await表达式的值
1.2 如果表达式的值不是promise对象,则通过 Promise.resolve 转换为 promise对象,等待其返回,并将其返回值作为await表达式的值
2. await相当于调用后面表达式返回promise的then方法,异步(等待)获取其返回值。即 await<==>promise.then
2.1 不