根据函数执行,反写函数
const log = (val) => { console.log(val) }
const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
const subFlow = createFlow([() => delay(1000).then(() => log("c"))]);
const subFlow2 = createFlow([() => delay(1000).then(() => log("6666"))]);
createFlow([
() => log("a"),
() => log("b"),
subFlow,
subFlow2,
[() => delay(1000).then(() => log("d")), () => log("e")],
() => log("qqqqqqqqqqq"),
]).run(() => {
console.log("done");
});
// 需要按照 a,b,延迟1秒,c,延迟1秒,666 延迟1秒,d,e, qqqqqqqqqqq, done 的顺序打印
const createFlow = (params) => {
const list = [...params].flat(Infinity).map(item => {
if (item.promiseList) {
// 有这个值就证明是createFlow执行过的函数 这是个数组,需要再次展开
return item.promiseList
}
return item
}).flat(Infinity)
/**
* 函数Promise化
* @param {Function} fn
*/
function toPromise(fn) {
return function () {
return new Promise(async function (resolve) {
const fnTem = fn()
if (isPromise(fnTem)) {
fnTem.then(resolve)
} else {
resolve()
}
})
}
}
/**
* 判断函数是不是Promise
* @param {Function} fn
*/
const isPromise = (p) => {
if (typeof p === 'object' && typeof p.then === 'function') {
return true;
}
return false;
}
/**
* 把数组内函数全部变成 promise
*/
const promiseList = list.map(item => {
if (!isPromise(item)) {
return toPromise(item)
}
return item
})
function run(cb) {
runPromise().then(cb)
}
/**
* 一个promise执行完,再执行下一个
*/
function runPromise() {
const task = promiseList.shift();
if (task) {
return task().then(runPromise)
}
}
return {
promiseList, // 每次执行都转成promise数组,但不执行。
run
}
}
const log = (val) => { console.log(val) }
const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
const subFlow = createFlow([() => delay(1000).then(() => log("c"))]);
const subFlow2 = createFlow([() => delay(1000).then(() => log("6666"))]);
createFlow([
() => log("a"),
() => log("b"),
subFlow,
subFlow2,
[() => delay(1000).then(() => log("d")), () => log("e")],
() => log("qqqqqqqqqqq"),
]).run(() => {
console.log("done");
});
// 需要按照 a,b,延迟1秒,c,延迟1秒,666 延迟1秒,d,e, qqqqqqqqqqq, done 的顺序打印
我得思路是按照promise走下来。
还有很多思路,可以参考,有什么新玩法可以贴代码给我,学习学习,欢迎评论。