Created
February 21, 2019 08:20
-
-
Save xnimorz/80f0cb07f9a9037b8a6ccd88084543b8 to your computer and use it in GitHub Desktop.
HighlighterProposal
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| function ResumeAboutMe(props) { | |
| const [aboutMe] = useHighligted(props.aboutMe); | |
| return ( | |
| <div> | |
| <HiglightedText>{aboutMe}</HiglightedText> | |
| </div> | |
| ); | |
| } | |
| connect( | |
| { aboutMe: state.resume.aboutMe }, | |
| { addToHightlight } | |
| )(ResumeAboutMe); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // highlight.js | |
| let registeredFields = {}; | |
| let registeredFieldsPromises = {}; | |
| let timeoutHandler = null; | |
| async function fetchHighlighter() { | |
| // Чтобы не взорвался рантайм и не было race conditions | |
| const pendingFields = registeredFields; | |
| const pendingFieldsPromises = registeredFieldsPromises; | |
| registeredFields = {}; | |
| registeredFieldsPromises = {}; | |
| timeoutHandler = null; | |
| // Фетчер | |
| try { | |
| const result = await fetcher.post('/highlight', pendingFields); | |
| Object.keys(result).forEach((key) => { | |
| pendingFieldsPromises[key].resolve(result[key]); | |
| }); | |
| } catch (e) { | |
| Object.keys(pendingFieldsPromises).forEach((key) => { | |
| pendingFieldsPromises[key].reject(); | |
| }); | |
| } | |
| } | |
| // Добавляем таску на фетчер только единожды, тротлинг на минималках | |
| function addToHighligterProcessor(key, field) { | |
| // сохраняем псевдо-маппинг (дешевый) и заводим промисы | |
| registeredFields[key] = field; | |
| let resolve; | |
| let reject; | |
| const promise = new Promise((_resolve, _reject) => { | |
| resolve = _resolve; | |
| reject = _reject; | |
| }); | |
| registeredFieldsPromises[key] = { promise, resolve, reject }; | |
| if (!timeoutHandler) { | |
| timeoutHandler = setTimeout(fetchHighlighter, 0); | |
| } | |
| // Этот промис и будет зарезолвлен | |
| return promise; | |
| } | |
| // Кастомный хук, чтобы реализация была скрыта | |
| export default function useHighligted(key, field) { | |
| const [value, setValue] = useState(field); | |
| useEffect(() => { | |
| addToHiglighterProcessor(key, field).then((highlighted) => { | |
| setValue(highlighted); | |
| }); | |
| }, [field]); | |
| return value; | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment