Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/460.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript SCORM:这是向LMS提交数据的正确行为吗_Javascript_Scorm_Scorm2004 - Fatal编程技术网

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

Javascript SCORM:这是向LMS提交数据的正确行为吗,javascript,scorm,scorm2004,Javascript,Scorm,Scorm2004,我有流动的问题。我有一个服装课程,我正在建设,这是基于SCORM 2004第三版,并部署在萨巴LMS。 我正在做的是: 我使用“API.SetValue”来设置一些数据 我使用“API.Commit”将数据保存到LMS (我正在使用,但它仍在使用核心功能) 现在我为不同的数据字段做了几次,让我们称它们为“X”、“Y”和“Z” 我所期望的是在向服务器发出第一个请求时,只看到正在发送的“X”,这正是我所看到的。然后在第二天,我希望只看到“Y”,但我不明白的是,我看到API同时发送“X”和“Y”。

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

  • 我使用“API.SetValue”来设置一些数据

  • 我使用“API.Commit”将数据保存到LMS

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

  • 现在我为不同的数据字段做了几次,让我们称它们为“X”、“Y”和“Z”

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

    你可以理解我关心的是什么。每次我想保存0.1k的数据时,我都要提出40-50K的请求


    有谁能向我解释这是SCORM的问题、我正在使用的特定LMS(SABA)还是我做错了什么?

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


    除了让LMS改变它的行为,我认为你真的没有办法。我遵循的经验法则是,只有在你真正需要的时候才承诺。您可以只调用X、Y和Z的SetValue,然后仅在转到另一个SCO或到达您决定必须将此数据保存到LMS的点时提交。

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


    除了让LMS改变它的行为,我认为你真的没有办法。我遵循的经验法则是,只有在你真正需要的时候才承诺。您可以只调用X、Y和Z的SetValue,然后仅在转到另一个SCO或到达您决定必须将此数据保存到LMS的点时提交。

    首先,我想说您没有做错什么,这完全是API的错-这是我今天遇到的第二个API(巧合lol)做坏事:

    有好的实践和想法,也有不好的——不幸的是,不好的实践和想法编写代码要快得多,所以人们在编写客户端API时往往不会考虑这些事情

    • 做事情最简单也是最糟糕的(字面上)方法是简单地设置单个对象中的所有数据,并在调用Commit时发送整个对象
    • 对此的一个改进是缓存自上次提交以来已更改的——好处是并非所有内容都会发送,缺点是不会更改的值会再次发送
    • 最好的做法是缓存调用commit时发送的,然后下次比较它们-这样只发送已更改的值
    • 最后是合并上述两种方法-缓存键,以便只检查这些值,而不是每个值
    其他需要牢记的事项:

    • 压缩数据是值得的——zip在Javascript中很容易实现,并且会显著减少网络带宽
    • 发送一个散列或幻数来验证数据也是一项要求——让服务器知道这应该设置
    • 使用散列或幻数进行回复很重要,这样客户机就知道缓存需要更新(发送时更新有点安全,但不如等待回复并知道服务器与客户机匹配那样安全)
    API中的数据可以以多种方式存储,但如果有选择,我会选择标准Javascript对象,每个键都是cmi键,值是一个对象(或数组),具有各种标志和缓存值以及当前值(用于后续的GetValue/Commit调用)

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



    重复我的第一句话——不是你的错,完全是API的错。对其进行更改对他们来说应该很容易-在服务器端,只需支持合并而不是替换发送的数据即可。

    首先我想说的是,您没有做错什么,这完全是API的错-这是我今天遇到的第二个API(巧合lol)做了不好的操作:

    有好的实践和想法,也有不好的——不幸的是,不好的实践和想法编写代码要快得多,所以人们在编写客户端API时往往不会考虑这些事情

    • 做事情最简单也是最糟糕的(字面上)方法是简单地设置单个对象中的所有数据,并在调用Commit时发送整个对象
    • 对此的一个改进是缓存自上次提交以来已更改的——好处是并非所有内容都会发送,缺点是不会更改的值会再次发送
    • 最好的做法是缓存