javascript – 如何在加载文件后将promise错误传播到更高的承诺级别?

前端之家收集整理的这篇文章主要介绍了javascript – 如何在加载文件后将promise错误传播到更高的承诺级别?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用 bluebird处理异步脚本加载器,我正在努力将错误传递到我可以捕获它的位置.

加载文件时,我正在调用名为declare的方法,如下所示:

  1. declare("storage",[
  2. {"name": 'util',"src": '../src/util.js'}
  3. ],function (util) {
  4. var storage = {};
  5. //...stuff with util
  6. return storage;
  7. });

声明为:

  1. declare = function (name,dependency_list,callback) {
  2. var resolver;
  3.  
  4. // digest promises returned for each module
  5. function digestDependencyArray(my_dependency_array) {
  6. var i,len,response_array;
  7.  
  8. len = my_dependency_array.length;
  9. for (i = 0,response_array = []; i < len; i += 1) {
  10. response_array[i] = my_dependency_array[i];
  11. }
  12.  
  13. return Promise.all(response_array);
  14. }
  15.  
  16. // resolve request promise
  17. function resolveDependencyArray(my_fullfillment_array) {
  18. var return_value = callback.apply(window,my_fullfillment_array);
  19.  
  20. // window.exports must be used when integrating commonjs modules
  21. if (!return_value) {
  22. return_value = window.exports;
  23. }
  24.  
  25. resolver(return_value);
  26. }
  27.  
  28. // START: set callback to (resolved) callback or new promise
  29. my_lib.callback_dict[name] = my_lib.callback_dict[name] ||
  30. new Promise(function (resolve) {
  31. resolver = resolve;
  32. if (dependency_list.length === 0) {
  33. return resolver(callback.apply(window));
  34. }
  35.  
  36. return request(dependency_list)
  37. .then(digestDependencyArray)
  38. .then(resolveDependencyArray)
  39. // DON'T CATCH HERE...
  40. .catch(console.log);
  41. });
  42. };

这一切都很好,除了我想在此时没有catch语句,因为错误处理应该在不同的模块中完成(console.log只是一个标志).

题:
如何将我的declare方法中出现的错误传播到更高的promise链?我曾希望在我的声明调用添加一个catch处理程序会有所帮助,但是这会破坏整个脚本 – 我假设因为我从我的声明调用和有效的promise响应返回模块.

谢谢你的任何提示

编辑:
我打电话来声明:

  1. request([{"name": "foo","src": "path/to/foo.js"}])
  2. .spread(foo) {
  3.  
  4. })
  5. .catch(function (e) {
  6. console.log(e);
  7. })

请求将加载文件在promise中,该文件在加载文件时得到解析,并以回调方式运行文件内容,然后调用上面的declare方法.不知怎的,我的错误在途中丢失了(代码here).让我们看看我是否可以在某处抓住它……

编辑2:
更改为此内部声明:

  1. function resolveDependencyArray(my_fullfillment_array) {
  2. var return_value = callback.apply(window,my_fullfillment_array);
  3.  
  4. if (!return_value) {
  5. return_value = window.exports;
  6. }
  7. return return_value;
  8. }
  9.  
  10. function handler() {
  11. if (dependency_list.length === 0) {
  12. Promise.resolve(callback.apply(window));
  13. } else {
  14. return request(dependency_list)
  15. .then(digestDependencyArray)
  16. .then(resolveDependencyArray)
  17. .catch(function (e) {
  18. reject(e);
  19. });
  20. }
  21. }
  22.  
  23. clappjs.callback_dict[name] = clappjs.callback_dict[name] || handler();

虽然我没有得到任何错误,但请求多个模块不起作用,因为未定义模块返回,因此:

  1. request(["foo","bar","baz"]).spread(function (foo,bar,baz) {
  2. console.log(foo); // undefined
  3. console.log(bar); // {} OK
  4. console.log(baz); // undefined
  5. });

与新的Promise一起加载后正确返回文件.

解决方法

你需要重新抛出错误
  1. .catch(function(e) {
  2. console.log(e); // calling it as a method,btw
  3. throw e;
  4. })

您还可以尝试使用tap,或者在添加.catch(console.log)之前返回链中的承诺.

此外,您正在使用manually-construct-promise antipattern,而您实际上应该永远不需要call the Promise constructor.只需使用您已有的承诺!看来你想这样做:

  1. my_lib.callback_dict[name] = my_lib.callback_dict[name] || (
  2. dependency_list.length === 0
  3. ? Promise.resolve()
  4. : request(dependency_list)
  5. .then(digestDependencyArray)
  6. .then(resolveDependencyArray) // don't call a global `resolver()`
  7. // just `return` the value!
  8. );

猜你在找的JavaScript相关文章