为什么在 mdn 的这个例子中,每个内部函数都将先前的(父)函数参数作为输入?

why in the this example from mdn each inner function takes previous (parent) function parameters as input?

MDN 的这个例子中,如果我们使用老式的异步回调来类比吃披萨的步骤,他们试图展示什么是异步链。

chooseToppings(function(toppings) {
  placeOrder(toppings, function(order) {
    collectOrder(order, function(pizza) {
      eatPizza(pizza);
    }, failureCallback);
  }, failureCallback);
}, failureCallback);

为什么在每个步骤中前面的函数参数都作为参数传递给内部函数?为什么他们不在每个函数中提供任何代码? 下面的代码更好吗?

chooseToppings(function(toppings) {
//some work with toppings
  placeOrder(function(order) {
//some work with order
    collectOrder(function(pizza) {
      eatPizza(pizza);
    }, failureCallback);
  }, failureCallback);
}, failureCallback);

这里有两个主要观点:

  • toppings 不是 chooseToppings 的参数,而是它的结果值。它不是 return 值,而是异步传递给 chooseToppings 接收的回调。所以 chooseToppings 产生 toppingsplaceOrder(toppings) 产生 ordercollectOrder(order) 产生 pizza.
  • 每个函数都依赖于前一个函数的结果。你不能在不知道浇头的情况下下订单。这些依赖关系通过传递值而不是上下文来明确表示。如果您没有这些依赖项,您可以一次调用所有函数,而无需等待异步结果。

Why they don't provide any code inside each function?

因为这些只是示例函数,所以它们的实现并不重要。您可以假设 placeOrder 完成了所有 // work with toppings,无论那是什么 - 本指南只关心如何按顺序调用这些异步函数。