2009-08-07 10 views
9

में असिंक्रोनस अजाक्स कॉल मैं एससीओआरएम 2004 चौथा संस्करण के लिए जावास्क्रिप्ट एपीआई बना रहा हूं। उन लोगों के लिए जो एससीओआरएम के बारे में नहीं जानते हैं, मूल रूप से यह एक एपीआई मानक है कि ई-लर्निंग कोर्स एलएमएस (लर्निंग मैनेजमेंट सिस्टम) के साथ संवाद करने के लिए उपयोग कर सकते हैं।एससीओआरएम एपीआई

  • प्रारंभ (args)
  • getValue (key)
  • setValue (कुंजी, मूल्य)
  • बर्खास्त (args)
  • कमिट (args): अब एपीआई निम्न विधि होना आवश्यक है
  • GetDiagnostic (args)
  • GetErrorString (args)
  • GetLastError()

अब प्रारंभ करना किसी और चीज से पहले कहा जाना चाहिए, और अंतिम को अंतिम रूप देना चाहिए। GetValue/SetValue को बीच में कहीं भी कहा जा सकता है। मैं जो कर रहा हूं वह प्रारंभिक विधि में है, मुझे वेब सेवा से कुछ JSON मिल रहा है और एपीआई में संग्रहीत किया जा रहा है (बाद में GetValue/SetValue विधियों का उपयोग करते समय उपयोग किया जाना चाहिए)। जिस समस्या में मैं आ रहा हूं वह यह है कि jQuery के माध्यम से AJAX कॉल एसिंक्रोनस है, इसलिए जेएसओएन लोड होने से पहले प्रारंभिक विधि कॉल किया जा सकता है। जिस तरह से यह है, प्रारंभ करने के बाद GetValue को कॉल करने से अप्रत्याशित समस्याएं जेएसओएन हो सकती हैं जो GetValue उपयोग अभी तक नहीं है। मेरा सवाल यह है: यह सुनिश्चित करने के लिए मैं क्या कर सकता हूं कि जेएसओएन को GetValue/SetValue विधियों से पहले लोड किया गया है? मुझे पता है कि सरल जवाब यह सिंक्रोनस बनाना है, लेकिन इसे अधिकतर सलाह नहीं दी जाती है, और ऐसा लगता है कि यह मेरे लिए ऐसा नहीं करना चाहता है। यहां मेरा कोड है:

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 
} 

क्या किसी के पास कोई विचार है? मुझे वास्तव में इसकी प्रशंसा करनी होगी!

उत्तर

10

आपने समस्या को अच्छी तरह से व्यक्त किया है। एससीओ कॉल शुरू करने के बाद, बाद में GetValue कॉल करने के लिए सीएमआई डेटा को तुरंत एससीओ के लिए उपलब्ध होना आवश्यक है। हालांकि, सिंक्रोनस AJAX कॉल करने की सलाह नहीं दी जाती है, अगर अनुरोध में एक हैंगअप है, तो अनुरोध पूरा होने या समय समाप्त होने तक यह पूरे ब्राउज़र को लॉक कर सकता है। समाधान एससीओ लोड होने से पहले सभी आवश्यक डेटा को प्री-लोड करना है। हमारे SCORM Engine implementation में, जब हम प्लेयर लॉन्च होते हैं तो हम सभी डेटा (सीएमआई और अनुक्रमण) को प्रीलोड करते हैं और फिर समय-समय पर गंदे डेटा को करने के लिए पृष्ठभूमि प्रक्रिया का उपयोग करते हैं क्योंकि छात्र पाठ्यक्रम के माध्यम से प्रगति करता है। यह सुनिश्चित करने के लिए थोड़ा मुश्किल हो सकता है कि संभावित विंडो लॉन्चिंग और बाहर निकलने के परिदृश्यों के संयोजन से निपटने के दौरान सभी डेटा ठीक से बने रहें, लेकिन यह निश्चित रूप से संभव है। आप एससीओआरएम एपीआई कॉल के भीतर सर्वर से किसी भी अनुरोध से बचना चाहेंगे क्योंकि एससीओ अक्सर कॉल के बड़े बैचों के साथ एलएमएस को बाढ़ करेंगे। उन कॉल के भीतर सर्वर अनुरोध करना गंभीर रूप से सीखने वाले के अनुभव को खराब कर सकता है और सर्वर पर प्रदर्शन बोझ डाल सकता है।

माइक

0

जिस तरह से हमने इस समस्या से संपर्क किया था, एससीओ लॉन्च होने पर एपीआई में सीएमआई डेटा कतार करना था। हम पहले लॉन्च पेज पर नेविगेट करते हैं जो सीएमआई डेटा को एपीआई की कतार में लोड करता है, और फिर लॉन्च पेज वास्तव में एससीओ लॉन्च करता है। जब एससीओ कॉल इंटिलाइज करता है, तो हम डेटा को सीएमआई में ले जाते हैं।