我有流动的问题。我有一个服装课程,我正在建设,这是基于SCORM 2004第三版,它是部署在SABA LMS。我正在做的是:
-
我使用API.SetValue"设置一些数据
-
我使用"API.Commit"将数据保存到LMS
(我正在使用包装器库,但它仍然使用核心函数)
现在我对不同的数据字段做了几次这样的操作,我们称它们为"X", "Y"one_answers"Z".
我期望的是在对服务器的第一个请求中,只看到"X"这正是我所看到的。然后在第二个我希望只看到"Y",但这是我不明白的,我看到API正在发送"X"one_answers";Y"。当然第三种是发送"x","y"one_answers"Z"
你可以理解我的担忧。每次我想保存0.1k的数据,我都必须发出40-50K的请求。
谁能向我解释一下这是SCORM的问题,我正在使用的特定LMS (SABA)还是我做错了什么?
这不是SCORM的事情。SCORM只是告诉你API——GetValue、SetValue、Commit等——以及每个调用的一般行为。但它并没有规定LMS实际上是如何做这些事情的。看起来LMS正在保存数据客户端。设置X时,它会保存在本地。当您调用Commit时,LMS将获取客户端的所有数据并将其发送回服务器。稍后,当您设置Y和Z时,它会做同样的事情-获取所有数据并将其发送回LMS。
如果不让LMS改变它的行为,我认为你真的无能为力。我的经验法则是,只有在真正需要的时候才去做。你可以只调用SetValue为X, Y和Z,然后提交只有当去到另一个SCO或到达一个点,你决定这些数据必须保存到LMS。
首先我想说你没有做错什么,这完全是API的错——这是我今天遇到的第二个API(巧合,哈哈)做了不好的实践:
有好的做法和想法,也有不好的——不幸的是,不好的做法和想法编码起来要快得多,所以人们在编写客户端API时往往不会考虑这些事情。
- 最简单也是最糟糕的方法是简单地将所有数据设置在单个对象中,并在Commit被调用时发送整个对象。
- 一个改进是缓存自上次提交以来更改的键 -好处是不是所有内容都被发送,缺点是不更改的值会再次发送。最好的方法是缓存调用commit时发送的值,然后在下次调用时比较它们-这样只有更改的值才会发送。
- 最后是合并上述两个方法-缓存键,所以你只检查这些值,而不是每一个。
其他注意事项:
- 压缩数据是值得的-压缩在Javascript中很容易做到,并且会显著减少网络带宽。
- 发送一个哈希值或幻数来验证数据也应该是一个要求-让服务器知道应该设置。
- 用哈希值或幻数回复是很重要的,这样客户端就知道缓存需要更新(发送时更新是安全的,但不如等待回复并知道服务器与客户端匹配那么安全)。
API中的数据可以以多种方式存储,但如果要选择,我会选择一个标准的Javascript对象,每个键都是cmi键,值是一个对象(或数组),具有各种标志和缓存值以及当前值(用于后续的GetValue/Commit调用)。
最后记住Commit本身是可选的——当SetValue被调用时,API本身应该在一段时间后有效地调用它。
所以重复我的第一句话-不是你的错,完全是API提供的错。对它进行更改对他们来说应该很容易——在服务器端,只需要支持合并而不是替换发送的数据。