Skip to main content

promise and priority

ใชใŒใ„้…ๅปถใ‚„ใพใกใŒใฃใŸๅ„ชๅ…ˆๅบฆใŒใ‚ใ‚‹ใจใ€error ใŒ็™บ็”Ÿใ™ใ‚‹ใ“ใจใŒๅบฆใ€…ใ‚ใ‚Šใพใ™ใ€‚ ไปŠๅ›žใฏ promise ใจ priority ใงใ€ๅŒๆœŸ็š„ใ‹ใค้ †็•ชใซๅฎŸ่กŒใงใใ‚‹ใ‚ˆใ†ใซใ—ใพใ™ใ€‚ codesandbox ใฎ demo ใŒใ‚ใ‚‹ใฎใงใ€ใ‚ˆใ‚ใ—ใ‘ใ‚Œใฐใ‚ใใ‚“ใงใฟใฆใใ ใ•ใ„ใ€‚


promiseAtomโ€‹

promise.then ใ‹ใ‚‰ function ใ‚’่ฟฝๅŠ ใ™ใ‚‹ใ“ใจใงใ€ๅŒๆœŸๅฎŸ่กŒใงใใ‚‹ใ‚ˆใ†ใซใชใ‚Šใพใ™ใ€‚ demoใงใฏใ€block ใŒ interact ใ—ใŸ้ †ใซ fade out ใ—ใฆใ„ใใพใ™ใ€‚

promiseAtom test - CodeSandbox


then ใ‹ใ‚‰ function ใ‚’่ฟฝๅŠ ใ—ใ€ๆœ€ๆ–ฐใฎ Promise ใ‚’current ใซไฟๅญ˜ใ—ใพใ™ใ€‚

function makePromise(executor = (resolve) => resolve()) {
let current = new Promise(executor);
return {
finally: (fun) => (current = current.finally(fun)),
catch: (fun) => (current = current.catch(fun)),
then: (fun) => (current = current.then(fun))
};
}

priorityAtomโ€‹

priority number ใซใ‚ˆใ‚Šใ€ๅŒๆœŸ็š„ใ‹ใค้ †ๆฌกๅฎŸ่กŒใŒใงใใ‚‹ใ‚ˆใ†ใซใชใ‚Šใพใ™ใ€‚ demo ใงใฏใ€้ซ˜ใ• y ใฏ priority number ใชใฎใง้ซ˜ใ„ใƒ–ใƒญใƒƒใ‚ฏใ‹ใ‚‰ๆถˆใˆใพใ™ใ€‚

priorityAtom test - CodeSandbox


function ใฎ่ฟฝๅŠ ใ”ใจใซ sort ใ—ใ€ๅฎŸ่กŒๆ™‚ใฏๅ…ˆ้ ญใฎ function ใ‚’ๅฎŸ่กŒใ—ใพใ™ใ€‚ binary heep ใง function ใ‚’ sort ใ™ใ‚‹ใจใ€ใ‚ˆใ‚Š performance tuning ใงใใใ†ใงใ™ใ€‚

function makePriority(executor = (resolve) => resolve()) {
const promise = makePromise(executor);
const current = [];
return {
finally: (fun) => promise.finally(fun),
catch: (fun) => promise.catch(fun),
then: (fun, priority = -1) => {
current.push([priority, fun]);
current.sort(([i], [j]) => i - j);
promise.then(async () => await current.shift()[1]());
return promise;
}
};
}