diff --git a/lib/utils.js b/lib/utils.js index 7bd0a1208c1..b93ae643bb5 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -390,23 +390,37 @@ const executeOperation = (topology, operation, args, options) => { } } - // Execute using callback - if (typeof callback === 'function') { - callback = args.pop(); - args.push((err, result) => { + const makeExecuteCallback = (resolve, reject) => + function executeCallback(err, result) { if (session && !options.returnsCursor) { session.endSession(() => { delete opOptions.session; - if (err) return callback(err, null); - return resultMutator ? callback(null, resultMutator(result)) : callback(null, result); + if (err) return reject(err); + if (resultMutator) return resolve(resultMutator(result)); + resolve(result); }); } else { - if (err) return callback(err, null); - return resultMutator ? callback(null, resultMutator(result)) : callback(null, result); + if (err) return reject(err); + if (resultMutator) return resolve(resultMutator(result)); + resolve(result); } - }); + }; - return operation.apply(null, args); + // Execute using callback + if (typeof callback === 'function') { + callback = args.pop(); + const handler = makeExecuteCallback( + result => callback(null, result), + err => callback(err, null) + ); + args.push(handler); + + try { + return operation.apply(null, args); + } catch (e) { + handler(e); + throw e; + } } // Return a Promise @@ -415,22 +429,15 @@ const executeOperation = (topology, operation, args, options) => { } return new Promise(function(resolve, reject) { - args[args.length - 1] = (err, r) => { - if (session && !options.returnsCursor) { - session.endSession(() => { - delete opOptions.session; - if (err) return reject(err); - if (resultMutator) return resolve(resultMutator(r)); - resolve(r); - }); - } else { - if (err) return reject(err); - if (resultMutator) return resolve(resultMutator(r)); - resolve(r); - } - }; + const handler = makeExecuteCallback(resolve, reject); + args[args.length - 1] = handler; - operation.apply(null, args); + try { + return operation.apply(null, args); + } catch (e) { + handler(e); + throw e; + } }); };