export function suspendListeners(obj, eventNames, target, method, callback) { if (!method && 'function' === typeof target) { method = target; target = null; } var suspendedActions = []; var actionsList = []; var eventName, actions, i, l; for (i=0, l=eventNames.length; i<l; i++) { eventName = eventNames[i]; actions = actionsFor(obj, eventName); var actionIndex = indexOf(actions, target, method); if (actionIndex !== -1) { actions[actionIndex+2] |= SUSPENDED; suspendedActions.push(actionIndex); actionsList.push(actions); } } function tryable() { return callback.call(target); } function finalizer() { for (var i = 0, l = suspendedActions.length; i < l; i++) { var actionIndex = suspendedActions[i]; actionsList[i][actionIndex+2] &= ~SUSPENDED; } } return tryFinally(tryable, finalizer); }
QUnit.test("no failure, return from finally", function() { finalizerResult = 'finalizer return value'; equal(tryFinally(tryable, finalizer), finalizerResult, 'crrect return value'); equal(tryCount, 1, 'tryable was called once'); equal(finalizeCount, 1, 'finalize was called once'); });
function callTryFinallyWithError() { var errorWasThrown; try { tryFinally(tryable, finalizer); } catch(e) { errorWasThrown = true; equal(e, error, 'correct error was thrown'); } equal(errorWasThrown, true, 'error was thrown'); }
export function suspendListener(obj, eventName, target, method, callback) { if (!method && 'function' === typeof target) { method = target; target = null; } var actions = actionsFor(obj, eventName); var actionIndex = indexOf(actions, target, method); if (actionIndex !== -1) { actions[actionIndex+2] |= SUSPENDED; // mark the action as suspended } function tryable() { return callback.call(target); } function finalizer() { if (actionIndex !== -1) { actions[actionIndex+2] &= ~SUSPENDED; } } return tryFinally(tryable, finalizer); }
QUnit.test("no failure", function() { equal(tryFinally(tryable, finalizer), tryableResult, 'correct return value'); equal(tryCount, 1, 'tryable was called once'); equal(finalizeCount, 1, 'finalize was called once'); });