我们有一个相当复杂的 JavaScript 异步系统。 JavaScript 库中的所有函数都设计为异步的。我们主要使用 AngularJS 延迟对象,一些部分使用 jQuery(不过我们不会将它们混在一起——即 Angular 代码等待 Angular 延迟 promise )。
我们遇到的问题是代码在启动时似乎“挂起”,5 次中有 2 次。缓存 JS 代码和 promise 解析的时间似乎有问题。
似乎没有任何工具或任何东西可以指出发生挂起时有问题的代码正在等待什么。
如何找到等待 promise 的 JavaScript 代码?
谢谢。
最佳答案
所以错误实际上最终与 promise 无关,而是依赖加载的时间。我们使用 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
没有通过浏览器,而是在系统的某个地方被捕获并“被忽略”。
一旦我们发现异常,就很容易跟踪链加载问题。
关于javascript - 如何找到等待 promise 的 JavaScript 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21824630/