我正在使用
bluebird处理异步脚本加载器,我正在努力将错误传递到我可以捕获它的位置.
- declare("storage",[
- {"name": 'util',"src": '../src/util.js'}
- ],function (util) {
- var storage = {};
- //...stuff with util
- return storage;
- });
声明为:
- declare = function (name,dependency_list,callback) {
- var resolver;
- // digest promises returned for each module
- function digestDependencyArray(my_dependency_array) {
- var i,len,response_array;
- len = my_dependency_array.length;
- for (i = 0,response_array = []; i < len; i += 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 be used when integrating commonjs modules
- if (!return_value) {
- return_value = window.exports;
- }
- resolver(return_value);
- }
- // START: set callback to (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);
- });
- };
这一切都很好,除了我想在此时没有catch语句,因为错误处理应该在不同的模块中完成(console.log只是一个标志).
题:
如何将我的declare方法中出现的错误传播到更高的promise链?我曾希望在我的声明调用上添加一个catch处理程序会有所帮助,但是这会破坏整个脚本 – 我假设因为我从我的声明调用和有效的promise响应返回模块.
谢谢你的任何提示!
编辑:
我打电话来声明:
- request([{"name": "foo","src": "path/to/foo.js"}])
- .spread(foo) {
- })
- .catch(function (e) {
- console.log(e);
- })
请求将加载文件在promise中,该文件在加载文件时得到解析,并以回调方式运行文件内容,然后调用上面的declare方法.不知怎的,我的错误在途中丢失了(代码here).让我们看看我是否可以在某处抓住它……
编辑2:
更改为此内部声明:
- 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();
虽然我没有得到任何错误,但请求多个模块不起作用,因为未定义模块返回,因此:
- request(["foo","bar","baz"]).spread(function (foo,bar,baz) {
- console.log(foo); // undefined
- console.log(bar); // {} OK
- console.log(baz); // undefined
- });
与新的Promise一起加载后正确返回文件.
解决方法
你需要重新抛出错误!
- .catch(function(e) {
- console.log(e); // calling it as a method,btw
- throw e;
- })
您还可以尝试使用tap
,或者在添加.catch(console.log)之前返回链中的承诺.
此外,您正在使用manually-construct-promise antipattern,而您实际上应该永远不需要call the Promise
constructor.只需使用您已有的承诺!看来你想这样做:
- 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 a global `resolver()`
- // just `return` the value!
- );