【发布时间】:2020-04-17 05:28:45
【问题描述】:
我遇到了一个不应该发生的问题:
参见initialUserState 的设置取决于三元运算的结果。但是,这个操作在这里应该返回 false(因为 context 对象中没有 user 属性。(您可以在下面的调试器中看到它)
这里可能发生了什么?
数据来自 NextJS 应用程序中的先前请求(我使用的是 Firefox 和 Firefox Private 模式)。这仅在请求彼此快速相邻时才会发生。所以我认为这是一个并发问题,但不明白为什么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: {},
}
这让我发疯了,看起来这是某种并发问题,我无法解释,因为如果请求及时间隔,则不会发生这种情况
【问题讨论】:
标签: javascript node.js concurrency next.js