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

时间:2014-02-17 08:59:49

标签: javascript jquery angularjs asynchronous promise

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

我们遇到的问题是代码似乎在启动时“挂起”,5次中有2次。当缓存JS代码和承诺解析的时间时,看起来有问题。

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

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

感谢。

1 个答案:

答案 0 :(得分: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();
    }
  }
}

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

一旦我们找到了异常,跟踪链加载问题就很容易了。