回调练习 Javascript

Callbacks Exercise Javascript

我一直在练习回调,我得到了这个练习,我一直在为语法而苦苦挣扎。这是我的代码:

function wash(callback) {
  setTimeout(function() {
    console.log('wash');
    callback();
  }, 3000);
}

function dry(callback) {
  setTimeout(function() {
    console.log('dry');
    callback();
  }, 2000);
}

function fold(callback) {
  setTimeout(function() {
    console.log('fold');
    callback();
  }, 1000);
}
  
doLaundry([wash, dry, fold]);

调用 doLaundry([wash,dry,fold]) 应该打印出以下内容:

wash dry fold Done!

通过调用此函数(需要工作)

function doLaundry() {
  // Call functions
}

我试过了,结果很接近,但语法错误或不需要:

  function doLaundry(actions, callback) {
          actions.forEach((item, index) => {
            wash(item, (error) => dry(item, (error) => fold(item, (error) => {})));
          });
        }

在查看了其他简单教程后,我真的很困惑如何实现带回调的 doLaundry()。有什么解决方法的建议吗?

由于函数不需要是异步的,我认为你把它弄得比实际需要的要复杂得多。只需遍历操作(函数)数组并调用它们。然后在最后记录Done

function wash() {
  console.log('wash');
}

function dry() {
  console.log('dry');
}

function fold() {
  console.log('fold');
}

const doLaundry = (fns) => {
  fns.forEach(fn => {
    fn();
  });
  console.log('Done!');
}

doLaundry([wash, dry, fold]);

或者,如果您必须坚持使用异步函数,您可以从链中的最后一个开始构建回调链,然后使用 reduceRight:

function wash(callback) {
  setTimeout(function() {
    console.log('wash');
    callback();
  }, 3000);
}

function dry(callback) {
  setTimeout(function() {
    console.log('dry');
    callback();
  }, 2000);
}

function fold(callback) {
  setTimeout(function() {
    console.log('fold');
    callback();
  }, 1000);
}

const doLaundry = (fns) => {
  const firstCallback = () => console.log('done');
  const firstFn = fns.reduceRight(
    (nextCallback, fn) => () => fn(nextCallback),
    firstCallback
  );
  firstFn();
}

doLaundry([wash, dry, fold]);

或者,为了更容易理解的方法,承诺每个回调并等待它们:

function wash(callback) {
  setTimeout(function() {
    console.log('wash');
    callback();
  }, 3000);
}

function dry(callback) {
  setTimeout(function() {
    console.log('dry');
    callback();
  }, 2000);
}

function fold(callback) {
  setTimeout(function() {
    console.log('fold');
    callback();
  }, 1000);
}

const toProm = fn => new Promise(resolve => fn(resolve));
const doLaundry = async (fns) => {
  for (const fn of fns) {
    await toProm(fn);
  }
  console.log('done');
}

doLaundry([wash, dry, fold]);

试试这个简单的代码:

只有一件事你要记住,如果我们在回调函数中传递参数,你必须在回调函数前面写一些这样的东西 ()=>

    function wash(dry) {
  console.log("wash");
  setTimeout(dry, 3000);
}
function dry(fold) {
  console.log("dry");
  setTimeout(fold, 2000);
}
function fold(done) {
  console.log("fold");
  console.log("done");
}

setTimeout(() => wash(() => dry(() => fold("done"))), 4000);