对于回调来讲,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"
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
的出现是为了解决回调嵌套
的操作繁琐和可读性差的问题。
声明
在回调环境函数运行
在等待回调结果过程中原子任务
举一个简单的例子
// 封装原子任务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"