尝试写了一下,用了Proxy以及用了两个数组做了简单的优先级,结果和期望一致:
const arrange = name => {
const wait = ms => new Promise(resolve => setTimeout(resolve, ms));
const list = [];
const priorityList = [];
let _priority = false;
list.push(() => console.log(`${name} is notified`));
const chain = new Proxy({}, {
get(_, prop) {
return data => {
const [_, method, priority = _priority] = /^(w+?)(First)?$/[Symbol.match](prop);
_priority = priority;
if (method === 'wait') {
(priority ? priorityList : list).push(async () => await wait(data * 1000));
} else if(method === 'do') {
(priority ? priorityList : list).push(() => console.log(`Start to ${data}`));
}
return chain;
}
}
});
setTimeout(async () => {
for (let func of priorityList) {
await func();
}
for (let func of list) {
await func();
}
}, 0)
return chain;
};
// arrange('William');
// arrange('William').wait(5).do('commit');
arrange('William').waitFirst(5).do('push');
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…