减少警告“草稿正在其他窗口中编辑”的显示频率

你好。

我是 BlenderArtists.org 论坛(https://blenderartists.org/)的一名成员,我拥有一台 4K 显示器,可以在屏幕上并排显示两个论坛页面。

有时,当我打算撰写长篇评论时,我会先在左侧页面打开消息编辑器准备回复(其中包含来自当前长线程的多个引用),然后在右侧页面浏览同一线程。

但每当我这样做时,经常会出现以下提示:

草稿正在另一个窗口中编辑。请重新加载此页面。

我并不反对这个警告(我相信它在某些情况下确实有用)。

是否可以在用户偏好设置中添加一个选项来禁用它?或者调整其显示频率(即计时器)

这个警告信息妨碍了我安心撰写消息。

感谢您考虑添加此选项。

5 个赞

抱歉,我们收到了太多关于此问题的支持请求,因此这个提醒是故意的。这是一个风险很高的工作流,您可能会丢失整篇帖子。

稍等,你是在两个地方同时编辑吗?具体的复现步骤是什么?

仅仅打开和浏览不应该触发此警告,你必须是从两个窗口进行编辑。

1 个赞

当您进入一个主题时,我们会自动(尝试)打开草稿以供编辑。即使您立即最小化编辑器,它仍处于活动状态并可能产生冲突。

4 个赞

是的,我也遇到过这个问题。确实很烦人,但我同意 Jeff 的观点,鉴于历史问题,我们需要在此保持谨慎。

我的解决办法通常是在两个标签页中打开该主题,等两者都加载完毕后再开始撰写。

1 个赞

这确实是一个 bug,防护机制应该只在开始输入时触发。

3 个赞

好的,如果我们有复现步骤,就可以修复它。

我也遇到过草稿自动打开的问题,但这比仅仅收到警告消息更糟糕。我曾回到帖子继续输入,随后却弹出提示,试图将我引导回另一个包含草稿的标签页。此时如果刷新页面,我只能看到草稿的旧版本,因此从这个意义上说,该功能实际上并没有阻止它试图防止的问题。

我不确定这是否发生在开始输入之前。我刚刚在 meta 上尝试复现,发现只有当我在第二个标签页开始输入时才会出现。我通常会在复制标签页以交叉核对写作内容后不久触发此问题。我会忘记自己最初是从哪个标签页开始的,而当我误在第二个标签页开始输入时,警告就会出现。

是否有可能/合理检测到给定话题的另一个标签页是否已经打开了编辑器?如果是,则不为新标签页打开编辑器?

4 个赞

这实际上太复杂了……我们或许可以通过 Web Workers 实现某些功能,但这将是一个巨大的改动,我不希望这样做。

我需要确切的逐步复现步骤。我们的警告触发得非常早,最坏的情况下你只会丢失几个字。我猜如果你处于离线状态,情况可能会变得奇怪,但这属于非常极端的边缘情况……解决方法是复制粘贴。

我刚刚查看了原始帖子(OP)。

我无法复现此问题,能否提供导致此错误消息的确切步骤?如果你没有进行编辑,只有在一种边缘情况下才会出现这条消息,而且严格来说这并不准确。但这只是一个非常微小的边缘情况。

  1. 打开标签页 1……开始撰写回复
  2. 打开标签页 2……四处浏览
  3. 在标签页 1……继续撰写
  4. 在标签页 2……最小化编辑器(你会收到一条警告消息……但仅出现一次)

可能导致你遇到问题的情况:

  1. 打开标签页 1……开始撰写回复
  2. 打开标签页 2……不小心引用了某些内容用于回复
  3. 在标签页 1……继续撰写……警告会持续存在(因为我们将会丢弃步骤 (2) 中的引用)

我只是不确定该如何修复这个问题……我需要复现步骤。

1 个赞

我确实遇到过内容大量丢失的情况。不过正因为如此,我一直很小心避免触发这个警告,所以现在记不清导致大量丢失的具体步骤了。

我认为问题可能出在:如果这保存了草稿,可能会覆盖你在标签页 1 中所做的工作。如果发生这种情况,就可能导致大量内容丢失。这目前只是推测,但我会尝试用这种方式复现该问题,然后告知你结果。

不可能,拜托……我需要复现步骤……每次保存草稿时都会执行冲突变更测试。

对于任何严重的内容丢失,我需要逐步复现步骤。

1 个赞

我明白您需要复现步骤。我已设置提醒(:tada:)在明晚查看。如果能大致了解冲突测试的工作原理,将非常有帮助。是在页面加载时生成唯一标识符,还是类似的操作?

每个草稿都通过一个唯一 ID 与编辑器紧密关联。该 ID 仅向前传递。

这是什么意思?

我的意思是,如果存在竞态条件……且两位作曲家为同一用户回复同一主题……那么最终只有一人获胜。每次保存时,都会随机选出一位所有者。

1 个赞

好的 @sam,我有复现步骤。不确定这是否与原始问题(OP)相关(因为对话已经有些偏离),但无论如何,以下是我掌握的情况。基本上,如果你打开标签页 2,但在标签页 2 完全加载之前继续在标签页 1 中输入,新页面就会进入错误状态。如果在标签页 2 仍在加载时继续在标签页 1 中输入,标签页 2 会加载标签页 1 在页面打开时的草稿,但即使在标签页 1 保存了额外更改后,你仍然可以在标签页 2 中编辑(从而覆盖这些更改)。以下是复现步骤:

  1. 打开主题 A 并开始撰写回复。
  2. 停止输入以保存草稿。
  3. 在新标签页中打开主题 A(复制标签页,或右键/中键点击主题标题是最容易复现的方式,因为它们需要完整页面加载,因此更慢)。
  4. 立即在标签页 2 加载完成之前继续在标签页 1 中撰写回复。
  5. 再次停止输入以保存草稿(这应该会成功,符合预期)。
  6. 切换到标签页 2 并在编辑器中输入。
  7. 停止输入。即使本应出现警告,草稿仍会被保存。这将覆盖你在步骤 #4 中在标签页 1 所做的所有额外更改。(如果你如预期收到了警告,可能是在步骤 #4 中开始输入的时间太晚了。)请注意,此时如果不刷新标签页 1,你将无法再次在其中输入。

注意:在步骤 #4 中,你实际上不需要在标签页 2 加载完成之前停止输入并保存草稿。只要开始输入,就会导致所有状态出错。实际上,在后台打开一个重复标签页稍后检查,同时继续在标签页 1 中输入,这并不不合理。但这样做太快会导致标签页进入错误状态,并可能意外覆盖你在标签页 1 中添加的内容。当然,最小化编辑器也会保存草稿,因此一旦进入这种错误状态,只需将标签页 2 中的编辑器最小化以移开,就会覆盖你在标签页 1 中的最新草稿。

此时,如果你回到最初撰写消息的标签页 1,你将无法再输入,并会收到本应在标签页 2 中出现的警告。如果你意识到草稿丢失,当然可以从标签页 1 的编辑器中复制内容。但如果你没有意识到并重新加载页面(按照警告的指示),你将丢失所做的更改,并且无法恢复。

如果你按照这些步骤仍然难以复现问题,请告诉我。按照这些步骤,我可以相当一致地复现该问题(偶尔切换到新主题以获取新草稿),因此希望这些信息足够。

10 个赞

好的,我这里有修复方案:

https://github.com/discourse/discourse/commit/a29ae17d3a57c6cd92716b53bbab5b9a229f77e7

非常感谢您提供的复现步骤,这非常精彩,帮助我迅速定位了问题。

我觉得我之前关于如何跟踪草稿版本的解释有些含糊其辞。我认为问题在于我的算法既天真又过于花哨。这可是致命的组合。新的算法要容易解释得多。

  • 每当客户端保存草稿时,它会告知服务器其当前的“序列号”。

  • 如果序列号匹配,服务器会将序列号加 1 并返回给客户端(即我们的新序列号)。

  • 如果序列号不匹配,服务器会告知客户端存在冲突,并且不会保存草稿。

  • 在页面重新加载/加载时,服务器会告知客户端当前的序列号。

我之前的实现过于花哨,试图通过跟踪序列号的所有者来避免在许多条件下增加序列号。您的测试用例揭示了这种做法的严重性,以及它如何导致内容丢失。

此修复应该已在 meta 站点上线,请告诉我您是否还能发现该系统中其他的边界情况。

10 个赞

这真是极高的赞誉,@seanblue,你完全有理由为此感到自豪 :tada:

4 个赞

我在 meta 上也遇到了同样的问题:

  • 我打开了一个编辑器,并输入了标题。
  • 为了对 这个 bug 截图,我将它从“新主题”改成了“新消息”。
  • 由于无法将其改回主题,我取消了该主题(即该消息)。
  • 然后我创建了一个新主题。

但系统却错误地显示了一个警告(因为我已经取消了该消息):

现在,即使我选择了“放弃它”,每隔 10-20 秒仍会收到这条消息:

而此时并没有其他标签页

这个问题只在我从主题切换到消息时出现。看来取消消息并没有真正取消它。

2 个赞

这需要相当多的工作,需要在浏览器标签页之间来回切换,不过……在这种情况下,‘放弃’功能显然未能成功放弃,我们应该修复这个问题。

5 个赞