PlacesTransactions¶
此模块充当 Places 的事务管理器(以下简称 PTM)。我们需要一个事务管理器,因为书签 UI 允许用户使用“撤销”和“重做”功能。为了实现事务,在 UI 和书签 API 之间插入了一层。此层将所有请求的更改存储在一个栈中,并对 API 执行调用。内部所有事务历史都实现为一个数组,将更改从最旧到最新的存储。
事务实现了所有基本 UI 命令:创建项目、编辑其属性等。所有命令都存储在事务历史记录中,并按顺序执行。
构建事务¶
事务由模块作为构造函数公开(例如 PlacesTransactions.NewFolder)。这些构造函数的输入采用单个参数的形式,一个包含事务属性的普通对象。输入属性可以是必需的或可选的(例如,keyword 对于 EditKeyword
事务是必需的,但对于 NewBookmark
事务是可选的)。
执行事务(事务的 transact 方法)¶
创建事务后,必须调用其 transact
方法才能执行并生效。这是一个异步方法,不接受任何参数,并在事务执行后返回一个解析的 Promise。
执行创建项目的事务之一(NewBookmark
、NewFolder
、NewSeparator
)会解析为新项目的 GUID。其他事务没有解析值。
如果事务执行失败,transact
会拒绝,并且事务历史记录不会受到影响。同样,如果在同一事务对象上多次调用 transact
(成功或失败),它都会抛出异常。
批处理¶
有时将事务“批处理”或“合并”很有用。
例如,“将所有选项卡添加为书签”可以实现为一个 NewFolder 事务,后面跟着许多 NewBookmark 事务——所有这些都将在单个撤销或重做命令中撤消或重做。
在这种情况下,使用 PlacesTransactions.batch
,传递一个事务数组,这些事务将按给定顺序执行,然后在事务历史记录中作为一个条目处理。 PlacesTransactions.batch
返回一个 Promise,在批处理执行后解析。如果一个事务依赖于先前事务的结果,则可以在数组中用一个函数替换它,该函数将 previousArguments
作为唯一参数,并返回一个事务。
事务历史结构¶
事务历史是一个二维事务栈:事务的顺序与提交的顺序相反。它是二维的,因为 PTM 允许将事务一起批处理以进行撤消或重做。
undoPosition 属性设置为顶部条目的索引。如果该索引处没有条目,则没有要撤消的内容。如果存在任何条目,则 undoPosition 之前的条目是重做条目,第一个条目是顶部重做条目。