ReactNのsetGlobalはPromiseを返すけど同期的更新できる
ReactNのsetGlobalはPromise<G>を返すので、てっきり「非同期にいつだかわからないタイミングで更新され、Promiseのthenが呼ばれる」と思っていた。
なので順番に呼ばれることを保証するためにはasync/awaitしなきゃいけないと思っていた。
これは間違い。
引数newGlobalStateがプロミスである場合以外は同期的に更新してからresolve済みのPromiseを返す。
code:ts
export default function _setGlobal<...>(
globalStateManager: GlobalStateManager<G, R>,
newGlobalState: NewGlobalState<G>,
callback: Callback<G, R> = null,
): Promise<G> { ... }
第一引数にデフォルトのGlobalStateManagerをbindしている
setGlobal: setGlobal.bind(null, defaultGlobalStateManager), index.ts 引数がPromiseでない場合は最終的にここにくる
code:ts
public setObject<O extends Partial<G> = Partial<G>>(
obj: O, ...
): Promise<Partial<G>> {
...
const stateChange: Partial<G> = this.flush(reducerName, reducerArgs);
return Promise.resolve(stateChange);
}
引数がPromiseの場合は与えられたPromiseのthenにつながる
code:ts
public setPromise(
promise: Promise<NewGlobalState<G>>, ...
): Promise<Partial<G>> {
return promise
.then((result: NewGlobalState<G>): Promise<Partial<G>> =>
this.set(result, reducerName, reducerArgs),
);
}