首页 > 解决方案 > 依次执行功能?不知道如何准确描述问题

问题描述

我遇到了一个试图解决它的问题;但不知何故卡在中间。问题是实现一个函数 $do() ,它可以接受任意数量的函数并按照它们被调用的顺序执行它们。在具体的例子中,在 700 毫秒内打印 a,在 200 内打印 b,然后在 100 毫秒内打印 c。挑战部分是虽然 c 应该首先打印,但是在 a 和 b 被调用之后在 $do() 中调用它。我的实现如下,几乎可以工作,但由于某种原因无法打印 c。需要帮助。非常感谢。

const a = (cb) => {
    setTimeout(() => {
        cb();
        console.log('a', 700);
    }, 700);
};

const b = (cb) => {
    setTimeout(() => {
        cb();
        console.log('b', 200);
    }, 200);
};


const c = (cb) => {
    setTimeout(() => {
        cb();
        console.log('c', 100);
    }, 100);
};

const stores = [];
let running = false;

function $do() {
    const cbs = Array.prototype.slice.call(arguments);
    stores.push(cbs);
    let i = 0;

    while (stores.length > 0 && !running) {
        let head = stores.shift();
        running = i < head.length;

        head.forEach((cb) => {
            cb(() => {
                i++;
                running = i < head.length;
                console.log(running);
            });
        });
    }
}

$do(a, b);
$do(c);

标签: javascript

解决方案


该解决方案使用闭包,并在调用当前调用中提供的每个函数之前Promise.all()等待每个先前挂起的调用完成。$do()

这意味着在两者都回调c之前不会被调用:ab

const delay = (name, ms) => cb => {
  setTimeout(() => {
    cb()
    console.log(name, ms)
  }, ms)
}

const a = delay('a', 700)
const b = delay('b', 200)
const c = delay('c', 100)

const $do = (() => {
  let done = Promise.resolve()

  return (...fns) => {
    done = done.then(
      () => Promise.all(fns.map(fn => new Promise(fn)))
    )
  }
})()

$do(a, b)
$do(c)


推荐阅读