I use a combination of promises for async and monadic results for sync, which enables me to write consistent code with "enforced" error-handling.
'use strict';
const defer = require('promise-defer');
const Result = require('result-js');
require('verror');
const fnAsync = function() {
const d = defer();
setTimeout(() => {
d.reject(new VError({
name: 'DummyError',
info: {
code: 12345,
},
}, 'This is an async %s error!', 'dummy'));
}, 1000);
return d.promise;
};
const fnSync = function() {
return Result.fromError(new VError({
name: 'DummyError',
info: {
code: 12345,
},
}, 'This is a sync %s error!', 'dummy'));
};
fnAsync().then(result => {}, error => {});
fnSync().then(result => {}, error => {});