Skip to content

Instantly share code, notes, and snippets.

@xnimorz
Created February 21, 2019 08:20
Show Gist options
  • Select an option

  • Save xnimorz/80f0cb07f9a9037b8a6ccd88084543b8 to your computer and use it in GitHub Desktop.

Select an option

Save xnimorz/80f0cb07f9a9037b8a6ccd88084543b8 to your computer and use it in GitHub Desktop.
HighlighterProposal
function ResumeAboutMe(props) {
const [aboutMe] = useHighligted(props.aboutMe);
return (
<div>
<HiglightedText>{aboutMe}</HiglightedText>
</div>
);
}
connect(
{ aboutMe: state.resume.aboutMe },
{ addToHightlight }
)(ResumeAboutMe);
// 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