背景
最近のデモであることをポイントのNeo4jブラウザのコードを変更する必要、あなたがコマンドを初期化したときに実行されるが、それを記録するコードの解析に多くの時間を費やしています。
目的
発送見つけるSINGLE_COMMAND_QUEUED
アクションの場所を。
PS:If'll Reduxの観察可能、Reduxの、RxJSこの兄弟は三つの言葉を見つけることができるものでなければなりません。。
分析
まず、我々はのNeo4jブラウザのソースコードを読み取ることで、問題のコマンドがであることを知っています:
- Reaux派遣アクション
- RxJSに流入するReduxの、観察可能な行動
- RxJS処理
- 流出アクション(複数可)で処理Reduxの、観察RxJS
達成。
私たちがすることができますので、年間胡主席はカットかを確認するために、2つだけの場所が自分のコードを(残りは中node_modulesある)は、コールスタックを見つけます。SINGLE_COMMAND_QUEUED
mergeMap
src/shared/modules/commands/commandsDuck.js:214
export const handleSingleCommandEpic = (action$, store) =>
action$
.ofType(SINGLE_COMMAND_QUEUED)
.merge(action$.ofType(SYSTEM_COMMAND_QUEUED))
.map(action =>
buildCommandObject(action, helper.interpret, getCmdChar(store.getState()))
)
.mergeMap(({ action, interpreted, cmdchar }) => {
// 这里截胡
/*
调用栈:
(anonymous) (commandsDuck.js:214)
...别人的代码
./src/browser/AppInit.jsx
*/
debugger;
return new Promise((resolve, reject) => {
const noop = { type: 'NOOP' }
if (!(action.cmd || '').trim().length) {
resolve(noop)
return
}
if (interpreted.name !== 'cypher') {
action.cmd = cleanCommand(action.cmd)
}
const res = interpreted.exec(action, cmdchar, store.dispatch, store)
if (!res || !res.then) {
resolve(noop)
} else {
res
.then(r => {
store.dispatch(fetchMetaData())
resolve(noop)
})
.catch(e => resolve(noop))
}
})
})
残念ながら、AppInit.js
何も直接の発送はありませんSINGLE_COMMAND_QUEUED
。このアクション。
src/browser/AppInit.js:87
// Signal app upstart (for epics)
store.dispatch({ type: APP_START, url: window.location.href, env })
見出さ見続けてSTARTUP_CONNECTION_SUCCESS
、このアクションは、列一連の動作を派遣した後、SINGLE_COMMAND_QUEUED
動作プログラムがアップmapToオペレータRxJSの初期化パラメータとして格納され、その後、STARTUP_CONNECTION_SUCCESS
発送後RxJSを流れ、次いでReduxの-観察ディスパッチするための貫通。これらの操作はを通じて行わ関数node_modules(Reduxの-観察、RxJS)で呼び出されます。
src/shared/modules/connections/connectionsDuck.js:398
export const startupConnectionSuccessEpic = (action$, store) => {
return action$
.ofType(STARTUP_CONNECTION_SUCCESS)
.do(() =>
store.dispatch(
executeSystemCommand(getCmdChar(store.getState()) + 'server status')
)
)
.mapTo(
// 这行在创建 epic 就执行了,创建出的 action 已经通过 redux-observable 保存在 rxjs 的 Subscribe 中。
// 所以截胡的结果除了src/browser/AppInit.js:87,别的全是调用的 rxjs 等模块的函数
executeSystemCommand(getInitCmd(store.getState()))
) // execute initCmd from settings
}