如何处理未捕获的java.lang.IllegalStateException:初始修订版已经设置好了吗?

时间:2013-05-03 22:38:00

标签: javascript google-drive-api google-drive-realtime-api

当我的基于实时API的应用程序使用频繁时,新用户很难加载数据模型。在此方案中,用户在其控制台中看到以下错误:

Uncaught java.lang.IllegalStateException: Initial revision has already been set. 
Ry index.html:705
Vx index.html:134
T index.html:900
bb index.html:399
Pf index.html:462
Sf index.html:982
(anonymous function) index.html:490
Kh api:152
W.Ga api:151
...

堆栈跟踪表示Realtime API注入的代码。

当现有用户停止与数据交互一段时间后,新用户可以按预期加载数据模型。

我已将错误函数传递给加载调用 - 因为它是rtclient.RealtimeLoader.prototype.loadrealtime-client-utils.js示例代码在Google Quickstart documentation中提供的示例代码。我的错误函数被调用了一些错误;但是,这个问题并不涉及错误案例。

我的数据模型加载代码应该是什么样的,以便用户能够在所有使用条件下使用我的应用程序?

Mayra建议只有当两个用户同时尝试初始化模型时才会出现此错误;但是,这与我看到的行为不符。为了帮助我得到答案,我创建了一个可以重现问题的jsFiddle example。该示例基于快速入门页面中提供的代码,只有很小的更改。

要重现此问题,请在三个浏览器选项卡中打开jsFiddle示例...

  • 如果您还没有这样做,请进行授权。
  • 从第一个标签中复制文件ID。
  • 在第二个标签页中,按Switch File按钮并将文件ID粘贴到提示框中。
  • 修改文本框中的文本并验证更改是否在选项卡之间传播...如果是,则实时API按预期工作。
  • 现在按两个标签中的Create Data按钮,将应用置于一定负载下。 (控制台中记录了一些细节)
  • 要在第三个标签中查看问题,请打开控制台以查看日志消息。
  • 同样在第三个选项卡中,将文件ID切换为其他两个选项卡使用的相同ID。注意第三个选项卡无法在指定的文件ID上进行协作,并看到我正在观察的错误。

有趣的细节是初始化函数根本没有被调用,只有一个用户试图在这种情况下初始化数据模型。

2 个答案:

答案 0 :(得分:2)

仅当两个用户尝试同时初始化新文档时才会发生这种情况。为了保证文档只被初始化一次,如果第二个用户尝试重新初始化已经初始化的文档,您将获得此异常。

正确的做法是在看到此异常时重新加载文档。然而,令人惊讶的是你经常看到这一点。

你在初始化函数中做了很多工作吗?您是否有一些设置,许多用户尝试同时加载相同的新文档?

答案 1 :(得分:1)

我没有足够的声誉留下评论 - 但我们也可以重复这个问题,而且不仅仅是在初始化时。它是完全可重现的,当一个用户试图打开一个文件(不是重新启动它,只是打开它)而另一个用户正在编辑它时发生。Here's a screenshot of the JS console

捕获这个的问题是它似乎发生在一个单独的调用堆栈中,所以try / catch around gapi.drive.realtime.load根本无法捕获它。在加载中使用错误处理程序参数也不起作用,这个错误似乎没有引起注意