SCORM:这是将数据提交给LMS的正确行为

时间:2015-09-29 08:56:27

标签: javascript scorm scorm2004

我有一个流动的问题。我有一个我正在制作的服装课程,它基于SCORM 2004第3版,并且部署在SABA LMS上。 我在做的是:

  1. 我使用“API.SetValue”来设置一些数据
  2. 我使用“API.Commit”将数据保存到LMS

    (我正在使用wrapper library,但它正在使用核心功能)

  3. 现在我对不同的数据字段进行了几次这样的操作,我们称之为“X”,“Y”和“Z”。

    我对服务器的第一个请求的期望是看到只发送“X”,这正是我所看到的。然后在第二个我希望只看到“Y”,但这是我不明白的,我看到API发送“X”和“Y”。当然第3个发送“X”,“Y”和“Z”

    你可以理解我关心的是什么。我得到一个点,每次我想要保存0.1k的数据,我必须做出40-50K的请求。

    有人可以向我解释这是SCORM的问题,我正在使用的特定LMS(SABA)还是我做错了?

2 个答案:

答案 0 :(得分:2)

这不是SCORM的事情。 SCORM只是告诉你API - GetValue,SetValue,Commit等 - 以及每个调用的一般行为。但它没有规定LMS如何实际做这些事情。似乎LMS正在保存数据客户端。因此,当您设置X时,它会将其保存在本地。当您调用Commit时,LMS将获取所有数据客户端并将其发送回服务器。稍后当你设置Y和Z时它会做同样的事情 - 获取所有数据并发送回LMS。

如果没有让LMS改变其行为,我认为你无法真正做到这一点。我经历的经验法则只是在您真正需要时提交。你可以只为X,Y和Z调用SetValue,然后只在进入另一个SCO时调用,或者到达你决定必须将这些数据保存到LMS的点。

答案 1 :(得分:2)

首先,我想说你没有做错,这完全是API的错误 - 这是我今天遇到的第二个API(巧合lol)做不好的做法:

有良好的做法和想法,有些是坏的 - 不幸的是,糟糕的做法要快得多,因此人们在组合客户端API时往往不会考虑这些事情。

  • 最简单和最差(字面意思)的做法是简单地在一个对象中设置所有数据,并在调用Commit时发送整个对象。
  • 对此的改进是缓存自上次提交以来已更改的密钥 - 好处是不是所有内容都被发送,缺点是不会再次发送不更改的值。
  • 最好的办法是缓存调用commit时发送的,然后在下次比较它们时 - 只会发送已更改的值。
  • 最后是合并上面的两种方法 - 缓存密钥,这样你只需检查这些值,而不是每一个。

要记住的其他事项:

  • 压缩数据是值得的 - 在Javascript中使用zip很容易,并且会显着降低网络带宽。
  • 发送哈希或幻数以验证数据也应该是一项要求 - 让服务器知道应该设置这个。
  • 使用哈希值或幻数进行回复非常重要,因此客户端知道需要更新缓存(在发送时更新是安全的,但不像等待回复那样安全,并且知道服务器与客户端匹配)

API中的数据可以通过多种方式存储,但是如果有选择,我会选择标准的Javascript对象,每个键都是cmi键,值是一个对象(或数组)。标志和缓存值以及当前值(用于后续的GetValue / Commit调用)。

最后请记住,Commit本身是可选的 - 在调用SetValue一段时间后,API本身应该有效地调用它。

所以重复我的第一句 - 不是你的错,完全是API提供的错误。对它们进行更改应该很容易 - 在服务器端,只需支持合并而不是替换发送的数据。