缺乏顺序性和可信任性。
回调函数是 JavaScript 异步的基本单元。但是随着 JavaScript 越来越成熟,对于异步编程
领域的发展,回调已经不够用了。
- 第一,大脑对于事情的计划方式是线性的、阻塞的、单线程的语义,但是回调表达异步流
程的方式是非线性的、非顺序的,这使得正确推导这样的代码难度很大。难于理解的代码
是坏代码,会导致坏 bug。
我们需要一种更同步、更顺序、更阻塞的的方式来表达异步,就像我们的大脑一样。 - 第二,也是更重要的一点,回调会受到控制反转的影响,因为回调暗中把控制权交给第三
方(通常是不受你控制的第三方工具!)来调用你代码中的 continuation。这种控制转移导
致一系列麻烦的信任问题,比如回调被调用的次数是否会超出预期。
可以发明一些特定逻辑来解决这些信任问题,但是其难度高于应有的水平,可能会产生更
笨重、更难维护的代码,并且缺少足够的保护,其中的损害要直到你受到 bug 的影响才会
被发现。 - 把一个回调传入工具 foo(…) 时可能出现如下问题:
• 调用回调过早;
• 调用回调过晚(或不被调用);
• 调用回调次数过少或过多;
• 未能传递所需的环境和参数;
• 吞掉可能出现的错误和异常。