1、厄运金字塔

有时候又称“回调地狱”

  1. loadScript('1.js', function(error, script) {
  2. if (error) {
  3. handleError(error);
  4. } else {
  5. // ...
  6. loadScript('2.js', function(error, script) {
  7. if (error) {
  8. handleError(error);
  9. } else {
  10. // ...
  11. loadScript('3.js', function(error, script) {
  12. if (error) {
  13. handleError(error);
  14. } else {
  15. // ...加载完所有脚本后继续 (*)
  16. }
  17. });
  18. }
  19. });
  20. }
  21. });

在上面这段代码中:
我们加载 1.js,如果没有发生错误。
我们加载 2.js,如果没有发生错误。
我们加载 3.js,如果没有发生错误 — 做其他操作 (*)。
如果调用嵌套的增加,代码层次变得更深,维护难度也随之增加,尤其是我们使用的是可能包含了很多循环和条件语句的真实代码,而不是例子中的 …。
有时这些被称为“回调地狱”或“厄运金字塔”。

2、Error 优先回调(error-first callback)

  1. loadScript('/my/script.js', function(error, script) {
  2. if (error) {
  3. // 处理 error
  4. } else {
  5. // 脚本加载成功
  6. }
  7. });
  1. callback 的第一个参数是为 error 而保留的。一旦出现 error,callback(err) 就会被调用。
  2. 第二个参数(和下一个参数,如果需要的话)用于成功的结果。此时 callback(null, result1, result2…) 就会被调用。

因此,单一的 callback 函数可以同时具有报告 error 和传递返回结果的作用。