回调地狱
callback hell最大的问题不是因为缩进。它引起的问题比缩进要大得多。
根本
它真正的问题是剥夺了程序员使用return和throw等捕捉错误和返回值的能力。
程序的执行流程是基于一个函数在执行过程中调用另一个函数时候会产生函数调用栈,而回调函数不是运行在栈上的,因此不能使用return和throw。
举例
function A(){
setTimeout(req,5000);
}
function B(){
ajax(url,response);
}
假设是这两个函数有顺序依赖的关系,我们要让A发生后B才执行,我们要把它们连接到一起的话只能手工硬编码:
function cb(){
setTimout(function(){
ajax(url,response);
},500);
}
这种方法会使得代码脆弱,你要在回调中捕获错误,一旦你指定了所有可能的事件或者各种错误的处理函数,代码会变得非常复杂。
这就是信任问题
信任问题
信任问题就是你的函数的执行是交给第三方的,而不是在JS的控制范围内。
不是你编写的代码,不是你的直接控制下,而是第三方提供的工具。
控制反转
这就是控制反转: 把自己程序的一部分交给某个第三方。
因为对这个第三方的API (像ajax()),它可能会出现很多问题,比如:
调用回调过早,
调用回调过晚,
不正确的调用回调(调用次数太多或太少),
没有把所需的参数成功返回给回调函数等。
这可能会导致你回调中的代码被错误执行了若干次而没有提示!!!!!!!!
eg:
本来你的ajax只是希望在<p>输出一段话,
结果多次错误回调导致输出了N段话!
困境
你必须在这个回调函数中创建大量逻辑来判断处理这些可能的情况。。。
回到两个挽救方法
分离回调
function success(data){
//
}
function failure(data){
//
}
ajax(url,success,failure);
一个用于成功的处理函数,一个用于错误的处理函数!
ES6就是这种分离回调设计。
error-first风格,nodejs
回调第一个参数作为错误对象(if exists)。
如果成功,error为 清空/置假
如果失败,if(er