如何找到等待承诺的JavaScript代码

use*_*201 7 javascript jquery asynchronous promise angularjs

我们在JavaScript中有一个相当复杂的异步系统.JavaScript库中的所有函数都设计为异步的.我们主要使用AngularJS延迟对象,有些部分使用jQuery(我们不会将它们混合在一起 - 即Angular代码等待Angular延迟promise).

我们遇到的问题是代码似乎在启动时"挂起",5次中有2次.看起来缓存JS代码时存在问题以及承诺解决方案的时间安排.

似乎没有任何工具或任何东西可以指出发生挂起时有问题的代码正在等待什么.

你如何找到等待承诺的JavaScript代码?

谢谢.

use*_*201 1

因此,错误实际上最终与承诺无关,而是与依赖项加载的时间有关。我们使用 LAB.js 作为文件加载器。LAB.js 支持 JavaScript 依赖项的“链式”加载机制。

发生的情况是,有 2 条我们尚未发布的链彼此相关。两个链都是异步加载的,因此,在运行 JavaScript 文件时,有机会尝试使用未加载的对象。

使问题更加复杂的是 Angular.js 1.2.13 在这种情况下悄然失败。在加载 Angular 服务期间发生异常,并且该异常从未传播到更高级别的代码,也没有任何调试表明它遇到了异常:

function getService(serviceName) {
  if (cache.hasOwnProperty(serviceName)) {
    if (cache[serviceName] === INSTANTIATING) {
      throw $injectorMinErr('cdep', 'Circular dependency found: {0}', path.join(' <- '));
    }
    return cache[serviceName];
  } else {
    try {
      path.unshift(serviceName);
      cache[serviceName] = INSTANTIATING;
      return cache[serviceName] = factory(serviceName);
    } catch (err) {
      if (cache[serviceName] === INSTANTIATING) {
        delete cache[serviceName];
      }
      throw err;
    } finally {
      path.shift();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

上面的内容throw err没有到达浏览器,并被系统中的某个地方捕获并“忽略”。

一旦我们发现异常,就很容易跟踪链加载问题。