SCORM:这是向LMS提交数据的正确行为吗?



我有流动的问题。我有一个服装课程,我正在建设,这是基于SCORM 2004第三版,它是部署在SABA LMS。我正在做的是:

  1. 我使用API.SetValue"设置一些数据

  2. 我使用"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提供的错。对它进行更改对他们来说应该很容易——在服务器端,只需要支持合并而不是替换发送的数据。

最新更新