[ReactNative] Improve error handling with missing bridge callback

Summary:
This will throw an error message with the problematic callback module/method. Previously we would get an invariant in this case when we try to access `callback.apply` later in the method.
This commit is contained in:
Eric Vicenti 2015-08-27 11:02:42 -07:00
parent 5dbde93ec6
commit 99bd57aef2
1 changed files with 15 additions and 17 deletions

View File

@ -65,13 +65,11 @@ class MessageQueue {
localModules && this._genLookupTables( localModules && this._genLookupTables(
localModules, this._moduleTable, this._methodTable); localModules, this._moduleTable, this._methodTable);
if (__DEV__) { this._debugInfo = {};
this._debugInfo = {}; this._remoteModuleTable = {};
this._remoteModuleTable = {}; this._remoteMethodTable = {};
this._remoteMethodTable = {}; this._genLookupTables(
this._genLookupTables( remoteModules, this._remoteModuleTable, this._remoteMethodTable);
remoteModules, this._remoteModuleTable, this._remoteMethodTable);
}
} }
/** /**
@ -116,13 +114,11 @@ class MessageQueue {
*/ */
__nativeCall(module, method, params, onFail, onSucc) { __nativeCall(module, method, params, onFail, onSucc) {
if (onFail || onSucc) { if (onFail || onSucc) {
if (__DEV__) { // eventually delete old debug info
// eventually delete old debug info (this._callbackID > (1 << 5)) &&
(this._callbackID > (1 << 5)) && (this._debugInfo[this._callbackID >> 5] = null);
(this._debugInfo[this._callbackID >> 5] = null);
this._debugInfo[this._callbackID >> 1] = [module, method]; this._debugInfo[this._callbackID >> 1] = [module, method];
}
onFail && params.push(this._callbackID); onFail && params.push(this._callbackID);
this._callbacks[this._callbackID++] = onFail; this._callbacks[this._callbackID++] = onFail;
onSucc && params.push(this._callbackID); onSucc && params.push(this._callbackID);
@ -155,13 +151,15 @@ class MessageQueue {
BridgeProfiling.profile( BridgeProfiling.profile(
() => `MessageQueue.invokeCallback(${cbID}, ${stringifySafe(args)})`); () => `MessageQueue.invokeCallback(${cbID}, ${stringifySafe(args)})`);
let callback = this._callbacks[cbID]; let callback = this._callbacks[cbID];
if (__DEV__) { if (!callback || __DEV__) {
let debug = this._debugInfo[cbID >> 1]; let debug = this._debugInfo[cbID >> 1];
let module = debug && this._remoteModuleTable[debug[0]]; let module = debug && this._remoteModuleTable[debug[0]];
let method = debug && this._remoteMethodTable[debug[0]][debug[1]]; let method = debug && this._remoteMethodTable[debug[0]][debug[1]];
if (!callback) { invariant(
console.error(`Callback with id ${cbID}: ${module}.${method}() not found`); callback,
} else if (SPY_MODE) { `Callback with id ${cbID}: ${module}.${method}() not found`
);
if (callback && SPY_MODE) {
console.log('N->JS : <callback for ' + module + '.' + method + '>(' + JSON.stringify(args) + ')'); console.log('N->JS : <callback for ' + module + '.' + method + '>(' + JSON.stringify(args) + ')');
} }
} }