gpt4 book ai didi

javascript - 依次执行功能?不确定如何准确描述问题

转载 作者:行者123 更新时间:2023-11-30 14:22:57 26 4
gpt4 key购买 nike

我在尝试解决问题时遇到了问题;但不知何故卡在了中间。问题是实现一个函数 $do() ,它可以接受任意数量的函数并按照它们被调用的顺序执行它们。具体例子中,700ms打印a,200ms打印b,100ms打印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);

最佳答案

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

这意味着 cab 都回调之前不会被调用:

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)

关于javascript - 依次执行功能?不确定如何准确描述问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52435786/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com