2009-08-07 45 views
9

Tôi đang tạo API javascript cho SCORM 2004 4th Edition. Đối với những người không biết về SCORM, về cơ bản nó là một tiêu chuẩn API mà các khóa học eLearning có thể sử dụng để giao tiếp với LMS (Hệ thống quản lý học tập). Bây giờ API phải có các phương pháp sau đây:Gọi Ajax không đồng bộ trong API SCORM

  • Initialize (args)
  • GetValue (key)
  • SetValue (key, value)
  • Chấm dứt (args)
  • Commit (args)
  • GetDiagnostic (args)
  • GetErrorString (args)
  • GetLastError()

Bây giờ, khởi tạo phải được gọi trước bất kỳ điều gì khác và Chấm dứt phải là cuối cùng. GetValue/SetValue có thể được gọi bất cứ nơi nào ở giữa đó. Những gì tôi đang làm là trong phương thức Initialize Tôi nhận được một số JSON từ một dịch vụ web và lưu trữ nó trong API (được sử dụng khi sử dụng các phương thức GetValue/SetValue sau). Vấn đề tôi gặp phải là cuộc gọi AJAX qua jQuery là không đồng bộ, do đó, lệnh gọi phương thức Initialize có thể được thực hiện trước khi JSON được nạp. Với đó là cách nó được, một cuộc gọi đến GetValue sau khi gọi Initialize có thể gây ra các vấn đề bất ngờ b/c JSON mà GetValue sử dụng là không có được nêu ra. Câu hỏi của tôi là: Tôi có thể làm gì để đảm bảo rằng JSON được nạp trước khi các phương thức GetValue/SetValue được gọi? Tôi biết câu trả lời đơn giản là làm cho nó đồng bộ, nhưng điều đó không được thông báo chủ yếu, và nó dường như không muốn làm điều đó đối với tôi. Đây là mã của tôi về điều đó:

function GetJSON(){ 
    var success = false; 
    $.ajaxSetup({async:false}); //should make it synchronous 
    $.getJSON("http://www.mydomain.com/webservices/scorm.asmx/SCORMInitialize? 
       learnerID=34&jsoncallback=?", 
      function(data){ 
       bind(data); 
       success = true; 
       } 
    ); 
    return success; 
} 

function bind(data){ 
    this.cmi = eval("(" + data.d + ")"); 
    $.ajaxSetup({async:true}); //should make it asynchronous again 
} 

Có ai có ý tưởng nào không? Tôi thực sự sẽ đánh giá cao nó!

Trả lời

10

Bạn đã trình bày rõ vấn đề. Sau khi SCO gọi khởi tạo, dữ liệu CMI cần phải có ngay lập tức để SCO thực hiện các cuộc gọi GetValue tiếp theo. Tuy nhiên, việc thực hiện các cuộc gọi AJAX đồng bộ không được thông báo, nếu có sự gác máy trong yêu cầu, nó có thể khóa toàn bộ trình duyệt cho đến khi yêu cầu trả về hoặc hết giờ. Giải pháp là tải trước tất cả các dữ liệu cần thiết trước khi SCO được nạp. Trong SCORM Engine implementation của chúng tôi, chúng tôi tải trước tất cả dữ liệu (CMI và trình tự) khi trình phát được khởi chạy và sau đó sử dụng quy trình nền để xác định dữ liệu bẩn theo định kỳ khi người học tiến hành thông qua khóa học. Nó có thể có một chút khôn lanh để đảm bảo rằng tất cả dữ liệu được lưu giữ đúng cách khi xử lý các kết hợp của các kịch bản khởi chạy và thoát khỏi cửa sổ có thể xảy ra, nhưng chắc chắn là có thể. Bạn sẽ muốn tránh bất kỳ yêu cầu nào đến máy chủ từ bên trong một cuộc gọi API SCORM vì các SCO thường sẽ tràn ngập LMS với các đợt gọi lớn. Yêu cầu máy chủ trong các cuộc gọi đó có thể làm suy giảm nghiêm trọng trải nghiệm của người học và đặt gánh nặng hiệu suất lên máy chủ.

Mike

0

Cách chúng tôi tiếp cận vấn đề này là xếp hàng dữ liệu CMI trong API khi SCO được khởi chạy. Đầu tiên, chúng tôi điều hướng đến trang khởi chạy tải dữ liệu CMI vào hàng đợi của API và sau đó trang laucnch thực sự khởi chạy SCO. Khi SCO gọi intialize, chúng tôi chỉ chuyển dữ liệu vào CMI.

Các vấn đề liên quan