回调地狱 promise asnc await处理异步过程
转载:https://www.jianshu.com/p/1b63a13c2701
// 1.指定回调函数的方式更加灵活
// 旧的:必须在启动异步任务前指定
// promise:启动异步任务=>返回promise对象=>给对象绑定回调函数(可以在异步任务结束后指定)
// 2.支持链式调用,可以解决回调地狱问题
// 什么是回调地狱?回调函数嵌套调用,外部回调函数异步执行的结果是嵌套的回调函数执行的条件
// 回调地狱的缺点:不便于阅读/不便于异常处理
// 解决方案?promise链式调用
// 最终解决方案? async /await async=>promise对象 await=>then处理
// 成功的回调函数
function successCallback(result){
console.log('文件1创建成功:'+result);
}
// 失败的回调函数
function failureCallback(error){
console.log("文件2创建失败:"+error);
}
//1. 使用纯回调函数(先执行回调再执行异步函数)
createFileAsync(successCallback,failureCallback)
// 2.使用Promise()不用考虑回调函数是否在异步函数执行前还是执行后进行执行
const promise=createFileAsync();
setTimeout(()=>{
promise.then(successCallback,failureCallback)
},3000)
// 3.回调地狱
doSomething(function(result){
doSomethingEls(result,function(newResult){
doThirdThing(newResult,function(finalResult){
console.log('Got the final result:'+finalResult)
},failureCallback)
},failureCallback)
},failureCallback)
// 4.使用promise的链式调用解决回调地狱
doSomething().then(function(result){
return doSomethingEls(result)
})
.then(function(newResult){
return doThirdThing(newResult)
})
.then(function(finalResult){
console.log('Got the final result:'+finalResult)
})
// async/await:回调地狱的终极解决方案
async function request(){
try{
const result=await doSomething()
const newResult=await doSomethingEls(result)
const finalResult=await doThirdThing(newResult)
console.log('Got the final result:'+finalResult)
}catch(error){
failureCallback(error)
}
}