Невозможная ошибка ... проблема параллелизма? Next Js / Node HTTP-сервер - PullRequest
0 голосов
/ 17 апреля 2020

У меня возникла проблема, которая не должна возникать:

enter image description here

См. initialUserState устанавливается в зависимости от результата троичного операция. Однако эта операция должна возвращать false здесь (поскольку в объекте context нет свойства user. (Вы можете увидеть это в отладчике ниже)

Что здесь может происходить?

Данные взяты из предыдущего запроса в приложении Next JS (я использую приватный режим Firefox и Firefox). Это происходит только тогда, когда запрос выполняется быстро рядом друг с другом. Поэтому я думаю, что это проблема параллелизма, но не могу понять, почему javascript не сработает с этим условием. Как initialUserState удерживает это значение, если я объявляю его снова здесь.

import {userInitialState} from "./UserContext";
import {listInitialState} from "./ListContext";
import {createContext, useState} from "react";

/**
 * Sets the initial application context
 */
export default class ApplicationContext {

    userContext;
    listContext;

    /**
     * Will set the initial application state.
     * @param context
     */
    constructor(context) {
        let initialUserState = context.hasOwnProperty('user') ? context.user : userInitialState;
        const userContextUpdater = () => {
            let [state, setState] = useState({...initialUserState})
            return [state, setState];
        }
        this.userContext = createContext(userContextUpdater);

        let initialListState = context.hasOwnProperty('list') ? context.list : listInitialState;
        const listContextUpdater = () => {
            let [state, setState] = useState({...initialListState})
            return [state, setState];
        }
        this.listContext = createContext(listContextUpdater);
    }

    /**
     * Returns the UserContext
     * @returns {*}
     */
    getUserContext = () => {
        return this.userContext;
    }

    /**
     * Returns the List context
     * @returns {*}
     */
    getListContext = () => {
        return this.listContext;
    }
}

_app. js

import ApplicationContext from "../lib/Context/ApplicationContext";
import {useContext} from "react";

export default function RankerApp({Component, pageProps}) {
    const applicationContext = new ApplicationContext(pageProps);
    const ListContext = applicationContext.getListContext();
    const UserContext = applicationContext.getUserContext();

    const [listState, setListState] = useContext(ListContext)();
    const [userState, setUserState] = useContext(UserContext)();

    return (
        <ListContext.Provider value={[listState, setListState]}>
            <UserContext.Provider value={[userState, setUserState]}>
                <Component {...pageProps} applicationContext={applicationContext}/>
            </UserContext.Provider>
        </ListContext.Provider>
    );
}

UserContext. js

export const userInitialState = {
    currentUserId: undefined,
    users: {},
}

Это сводит меня с ума, похоже, что это какая-то проблема параллелизма, я не могу объяснить это иначе, так как это не ' Это происходит, если запрос разнесен во времени

enter image description here

enter image description here

1 Ответ

0 голосов
/ 17 апреля 2020

Кажется, меня укусили ссылки на объекты.

Это было раньше:

enter image description here

Это исправление

enter image description here

Итак, здесь я присвоил returnContext['user'] ссылку на userInitialState

И затем изменил ее прямо ниже.

Поскольку по какой-то причине мое приложение Next JS сохраняет данные (я не знаю, происходит ли это из-за того, что это скомпилированный сервер, но переменные внутри Pages остаются, если я поставил счетчик), это значение также сохранялось.

...