【问题标题】:Sequential programming with setTimeout in JavaScript?在 JavaScript 中使用 setTimeout 进行顺序编程?
【发布时间】:2019-11-05 14:38:33
【问题描述】:

我尝试过使用setTimeout,但我添加了pizzaTask 方法,setTimeout 似乎不起作用。是的,我不想要任何异步或承诺。

function preparePizza(n) {
  console.log("Finish preparing pizza " + n);
  console.log("Start baking pizza " + n);
  setTimeout(bakePizza, 10000);
}

function bakePizza() {
  console.log("Finish baking pizza");
}

function makePizza(n) {
  console.log("Start preparing pizza " + n);
  setTimeout(preparePizza(n), 5000);
}

function pizzaTask() {
  for (let x = 1; x <= 10; x++) {
    makePizza(x);
  }

  console.log("Read to take new order ...");
}

pizzaTask();

【问题讨论】:

  • setTimeout 接受一个函数 - 您将函数的返回值传递给它,即 undefined,因为您在括号内调用函数。
  • 您可以将preparePizza 调用包装在箭头函数中,这样您仍然可以将n 传递给preparePizza 而无需立即执行它。 setTimeout(() =&gt; { preparePizza(n) }, 5000);
  • stackoverflow.com/questions/20890943/… 正确的欺骗,以及非描述性的“它不工作!”

标签: javascript


【解决方案1】:

问题在于您调用preparePizza(n) 的方式,这会调用返回undefined 的函数。您需要传递一个函数并在此函数中调用它,因为preparePizza 接受一个参数n。解决方案如下。

  function preparePizza(n) {
    console.log("Finish preparing pizza " + n);
    console.log("Start baking pizza " + n);
    setTimeout(bakePizza, 10000);
  }

  function bakePizza() {
    console.log("Finish baking pizza");
  }

  function makePizza(n) {
    console.log("Start preparing pizza " + n);
    setTimeout(function() {
      preparePizza(n)
    }, 5000);
  }

  function pizzaTask() {
    for (let x = 1; x <= 10; x++) {
      makePizza(x);
    }

    console.log("Read to take new order ...");
   }
  
   pizzaTask();

【讨论】:

  • 但是如何让console.log("Read to take new order ...");在完成所有的比萨饼后运行?
  • 它开始同时准备所有 10 个披萨。如何让它在当前的比萨烤完后才准备比萨饼?
  • 听起来你想要的是承诺链:developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/…
猜你喜欢
  • 1970-01-01
  • 2011-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多