微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我正在使用 bluebird处理异步脚本加载器,我正在努力将错误传递到我可以捕获它的位置.

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

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!
);

原文地址:https://www.jb51.cc/js/156177.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐