Skip to content

Instantly share code, notes, and snippets.

View sag1v's full-sized avatar
🎯
Focusing

Sagiv ben giat sag1v

🎯
Focusing
View GitHub Profile
@sag1v
sag1v / Markdium-JSX.jsx
Created October 25, 2019 20:23
Markdium-React race condition bug
let _previousKey;
function Pets() {
//...
useEffect(() => {
_previousKey = pets.selectedPet;
if (pets.selectedPet) {
dispatch({ type: "FETCH_PET" });
getPet(pets.selectedPet).then(data => {
@sag1v
sag1v / Markdium-JSX.jsx
Created October 25, 2019 20:23
Markdium-React race condition bug
function Pets() {
//...
const _previousKeyRef = useRef(null);
useEffect(() => {
_previousKeyRef.current = pets.selectedPet;
if (pets.selectedPet) {
dispatch({ type: "FETCH_PET" });
getPet(pets.selectedPet).then(data => {
if (_previousKeyRef.current === pets.selectedPet) {
@sag1v
sag1v / Markdium-JSX.jsx
Created October 25, 2019 20:23
Markdium-React race condition bug
useEffect(() => {
let abort = false;
if (pets.selectedPet) {
dispatch({ type: "FETCH_PET" });
getPet(pets.selectedPet).then(data => {
if(!abort){
dispatch({ type: "FETCH_PET_SUCCESS", payload: data });
}
});
@sag1v
sag1v / Markdium-JSX.jsx
Created October 25, 2019 20:23
Markdium-React race condition bug
const initialState = { loading: false, selectedPet: "", petData: null }
function petsReducer(state, action) {
switch (action.type) {
case "PET_SELECTED": {
return {
...state,
selectedPet: action.payload
};
}
@sag1v
sag1v / Markdium-JSX.jsx
Created October 25, 2019 20:23
Markdium-React race condition bug
useEffect(() => {
let _previousKey = pets.selectedPet;
if (pets.selectedPet) {
dispatch({ type: "FETCH_PET" });
getPet(pets.selectedPet).then(data => {
if (_previousKey === pets.selectedPet) {
dispatch({ type: "FETCH_PET_SUCCESS", payload: data });
}
});
} else {
@sag1v
sag1v / Markdium-JSX.jsx
Created October 25, 2019 20:23
Markdium-React race condition bug
const petsDB = {
dogs: { name: "Dogs", voice: "Woof!", avatar: "🐶" },
cats: { name: "Cats", voice: "Miauuu", avatar: "🐱" }
};
export function getPet(type) {
return new Promise(resolve => {
// simulate a fetch call
setTimeout(() => {
resolve(petsDB[type]);
@sag1v
sag1v / Markdium-JSX.jsx
Last active October 25, 2019 20:49
Markdium-React race condition bug
function Pets() {
const [pets, dispatch] = useReducer(petsReducer, initialState);
const onChange = ({ target }) => {
dispatch({ type: "PET_SELECTED", payload: target.value });
};
useEffect(() => {
if (pets.selectedPet) {
dispatch({ type: "FETCH_PET" });
@sag1v
sag1v / Markdium-JSX.jsx
Created October 25, 2019 20:23
Markdium-React race condition bug
export function getPet(type) {
const delay = type === "cats" ? 3500 : 500;
return new Promise(resolve => {
// immulate fetch call
setTimeout(() => {
resolve(petsDB[type]);
}, delay);
});
}
@sag1v
sag1v / Markdium-JSX.jsx
Created October 25, 2019 20:23
Markdium-React race condition bug
useEffect(() => {
if (pets.selectedPet) {
dispatch({ type: "FETCH_PET" });
getPet(pets.selectedPet).then(data => {
dispatch({ type: "FETCH_PET_SUCCESS", payload: data });
});
} else {
dispatch({ type: "RESET" });
}
}, [pets.selectedPet]);
@sag1v
sag1v / Markdium-JSX.jsx
Created November 25, 2019 14:27
Markdium-JavaScript - The prototype chain in depth
class Player {
}