假设您是一个使用大量AJAX请求和其他异步方法(例如Observable订阅)的项目的新手。如果您看到间歇性问题,并且您怀疑问题是由于AJAX响应的时间安排以及由此产生的可观察更新,您将如何开始调试?
这就是我所做的。首先,我绘制了相关代码的序列图。然后我试着想象会导致问题的场景,比如无序的AJAX响应。这需要花费大量时间,因此我经常尝试将延迟引入各种REST端点,以尝试一致地暴露问题。我尝试过的另一种霰弹枪调试技术是记录所有事件和可观察到的更新,但这实在太冗长了。
有更好的方法吗?很难想象所有的复杂性,并且提出潜在的原因似乎只是在黑暗中拍摄。
答案 0 :(得分:1)
简而言之,您必须记录所有异步依赖项,然后您必须编写代码以确保无论何时,所有依赖项都得到满足。这是开始的地方。如果此信息不是100%已知,那么您甚至无法开始确保设计正确。
因此,这意味着确切地确定哪些操作是独立的,并且可以自己运行并在任何时候完成哪些操作具有必须首先完成的依赖异步操作。对于具有依赖关系的操作,您必须确保代码强制执行该依赖关系。这不是您想象序列操作或奇怪时序的步骤。这是您完全理解并记录每个异步操作的步骤,在此操作可以启动之前或处理结果之前必须完成的操作。
Promise通常是一个很好的架构,可以在代码中声明依赖关系,然后强制执行该依赖关系。
因此,如果a
和b
必须在c
运行之前完成,那么您必须编写代码,以便您的代码强制执行该依赖。
我不建议你只是试着测试它以“找到”所有问题。这不仅难以实现,而且实际上并不是确保您理解设计要求的结构化方法,而是您拥有旨在实现这些设计要求的代码。
一旦你认为你完全理解了所需要的东西,并认为你已经实现了它,那么只有这时才能开始弄清楚你是否可以测试你所构建的内容,看它是否会以你期望的方式做出反应。作为检查,看看你是否错过了任何依赖。这是您开始计算如何创建无序结果以测试依赖关系的步骤。但是,你只是这样做来测试你已经识别和编码的依赖项是否正常工作和实现,而不是找到要设计的新东西。
如果您的项目包含大量异步操作,我强烈建议您使用某种库来帮助您管理这些异步操作和它们之间的依赖关系。根据您在项目中使用的其他内容以及它是客户端还是服务器,您有许多不同的选择。整个承诺体系结构看起来像是未来这类事物的主要设计方向之一 - ES6将内置承诺,许多像jQuery这样的库都有内置的承诺实现等等......承诺允许您可以对异步操作进行排序,也可以声明在开始下一个操作之前必须完成多个异步操作,依此类推。
还有一件事。一旦你发现问题并需要帮助调试它,你通常不能在代码中使用断点,因为它们往往会弄乱后来发生的所有事情的时间,这完全改变了你想要看到的情况(亲切的)类似于海森堡不确定性原理的异步调试)。因此,我倾向于使用详细的日志记录,因此一旦您发现问题,您可以返回并研究日志并查看实际发生的情况。通过更详细地了解可能发生的情况,您可以经常添加更多有针对性的日志记录,或者然后设置断点来检查问题,或者到那时,您将看到代码中没有工作的依赖项是或错过了你必须编码的。
答案 1 :(得分:0)
“欢迎朋友,参加AJAX的异步世界”,这是我给你的开场白......
简而言之,您需要一个调试器和一个卡车装载的断点。获取firebug for Firefox我的朋友或尝试google chrome开发者控制台(使用Chrome时点击F12!)。这两个调试器都非常适合检查服务器的响应,代码执行期间的时间和中断。如果您正在使用JSON,它们还允许您检查对象结构,从而节省数小时的精神图像问题。
我诚实的建议是:
这可能需要一些时间,因为你需要经常重构你的脚本,但它肯定比setTimeouts,setIntervals或其他的猎枪技术更好,如果服务器响应的时间比平时要长,它们就会崩溃。