javascript - How to propagate a promise error to a higher promise level after loading a file? -
i'm working on async script loader using bluebird , i'm struggling pass error can catch it.
when file loaded i'm calling method named declare this:
declare("storage", [ {"name": 'util', "src": '../src/util.js'} ], function (util) { var storage = {}; //...stuff util return storage; }); with declare being:
declare = function (name, dependency_list, callback) { var resolver; // digest promises returned each module function digestdependencyarray(my_dependency_array) { var i, len, response_array; len = my_dependency_array.length; (i = 0, response_array = []; < len; += 1) { response_array[i] = my_dependency_array[i]; } return promise.all(response_array); } // resolve request promise function resolvedependencyarray(my_fullfillment_array) { var return_value = callback.apply(window, my_fullfillment_array); // window.exports must used when integrating commonjs modules if (!return_value) { return_value = window.exports; } resolver(return_value); } // start: set callback (resolved) callback or new promise my_lib.callback_dict[name] = my_lib.callback_dict[name] || new promise(function (resolve) { resolver = resolve; if (dependency_list.length === 0) { return resolver(callback.apply(window)); } return request(dependency_list) .then(digestdependencyarray) .then(resolvedependencyarray) // don't catch here... .catch(console.log); }); }; this works fine except not have catch statement @ point, because error handling should done in different module (the console.log flag).
question:
how propagate error occuring in declare method higher promise chain? had hoped adding catch handler on declare calls help, breaks whole script - assume because i'm returning module declare call vs valid promise response.
thanks tips!
edit:
i'm calling declare this:
request([{"name": "foo", "src": "path/to/foo.js"}]) .spread(foo) { }) .catch(function (e) { console.log(e); }) request load file inside promise gets resolved when file loaded , run file content callback, calls above declare method. somehow error lost on way (code here). let's see if can catch somewhere...
edit 2:
changing inside declare:
function resolvedependencyarray(my_fullfillment_array) { var return_value = callback.apply(window, my_fullfillment_array); if (!return_value) { return_value = window.exports; } return return_value; } function handler() { if (dependency_list.length === 0) { promise.resolve(callback.apply(window)); } else { return request(dependency_list) .then(digestdependencyarray) .then(resolvedependencyarray) .catch(function (e) { reject(e); }); } } clappjs.callback_dict[name] = clappjs.callback_dict[name] || handler(); while no errors, requesting multiple modules not work because modules returned undefined, so:
request(["foo", "bar", "baz"]).spread(function (foo, bar, baz) { console.log(foo); // undefined console.log(bar); // {} ok console.log(baz); // undefined }); versus new promise returning file once it's loaded.
you need rethrow error!
.catch(function(e) { console.log(e); // calling method, btw throw e; }) you might try use tap, or return promise have in chain before adding .catch(console.log).
also, using manually-construct-promise antipattern, while should never need call promise constructor. use promise have! seems want this:
my_lib.callback_dict[name] = my_lib.callback_dict[name] || ( dependency_list.length === 0 ? promise.resolve() : request(dependency_list) .then(digestdependencyarray) .then(resolvedependencyarray) // don't call global `resolver()` // `return` value! );
Comments
Post a Comment