前言
对于回调来讲,Promise
的到来看似只解决了回调场景中的状态处理问题,但是JavaScript
中令人头疼不是回调
,而是 回调嵌套
。同时,Promise
的出现,也不能彻底解决回调嵌套的带来的代码维护和可读性的问题。
原生回调嵌套
function increase(num, callback) {
setTimeout(() => {
if( !(num >= 0) ) {
callback(new Error('The parameters must be greater than zero'), null)
} else {
let result = num + 1;
callback(null, result);
}
}, 100)
}
increase(1, (err, result1) => {
if(!err) {
console.log(`result1 = ${result1}`)
increase(result1, (err, result2) => {
if(!err) {
console.log(`result2 = ${result2}`)
increase(result2, (err, result3) => {
if(!err) {
console.log(`result3 = ${result3}`)
} else {
console.log(err)
}
})
} else {
console.log(err)
}
})
} else {
console.log(err)
}
})
// 运行结果
// "result1 = 2"
// "result1 = 3"
// "result1 = 4"
Promise 处理回调嵌套
function increase(num) {
return new Promise((resolve, reject) => {
setTimeout(() => {
if( !(num >= 0) ) {
reject(new Error('The parameters must be greater than zero'))
} else {
let result = num + 1;
resolve(result);
}
}, 100)
})
}
increase(1).then((result1) => {
console.log(`result1 = ${result1}`)
increase(result1).then((result2) => {
console.log(`result2 = ${result2}`)
increase(result2).then((result3) => {
console.log(`result3 = ${result3}`)
}).catch(err => console.log(err));
}).catch(err => console.log(err));
}).catch(err => console.log(err));
// 运行结果
// "result1 = 2"
// "result1 = 3"
// "result1 = 4"
所以这时候,需要一个更优雅处理
Promise 嵌套任务
的语法,因此,async/await
就横空出世,也就是直接或间接解决了回调嵌套
的问题。
一句话,async/await
的出现是为了解决回调嵌套
的操作繁琐和可读性差的问题。aysnc/await的使用
async 是
声明
在回调环境函数- await 是
运行
在等待回调结果过程中 - Promise 是封装了回调操作的
原子任务
举一个简单的例子
// 封装原子任务
function increase(num) {
return new Promise((resolve, reject) => {
setTimeout(() => {
if( !(num >= 0) ) {
reject(new Error('The parameters must be greater than zero'))
} else {
resolve(num + 1)
}
}, 100);
}).catch(err => console.log(err))
}
// 声明任务环境
async function envIncrease() {
let num = 1;
// 等待回调任务结果1返回
let result1 = await increase(num);
console.log(`result1 = ${result1}`);
// 等待回调任务结果2返回
let result2 = await increase(result1);
console.log(`result2 = ${result2}`);
// 等待回调任务结果3返回
let result3 = await increase(result2);
console.log(`result3 = ${result3}`);
return result3
}
// 声明任务环境
async function env() {
// 等待 环境 Increase 的结果返回
let result = await envIncrease()
console.log(`result = ${result}`);
}
// 运行环境
env()
// 运行结果
// "result1 = 2"
// "result1 = 3"
// "result1 = 4"