2011-12-23 10 views
15

मैं javax.script JDK के पैकेज का उपयोग कर रहा *।। विशेष रूप से, मैं जावास्क्रिप्ट इंजन का उपयोग कर रहा हूं, जो मैंने पढ़ा है, वह मोज़िला-विकसित जावास्क्रिप्ट-इन-जावा दुभाषिया पर आधारित है जो राइनो नामक है।व्याख्या जावास्क्रिप्ट: रोक/शुरू करने लिपियों

मेरा लक्ष्य क्या है आशा करती हूं कि मूल रूप से मेरी जावास्क्रिप्ट "ठहराव" ही कोड में एक निश्चित बिंदु (जैसे कि, आधे रास्ते एक समारोह कॉल के माध्यम से) पर और केवल अपने आप बाद में फिर से शुरू कर दिया है करने के लिए जब जावा यह करने के लिए अनुमति देता है इसलिए।

इसे समझने के लिए मैं क्या मतलब है, यह जावा स्क्रिप्ट कोड की कल्पना:

function myJSFunction() { 
    print("Hello "); 
    mysteriousPauseFunction(); // this is the part I'm wondering about. basically, the script should break here and resume later at Java's discretion... 
    // upon reaching this comment, we know now that Java has told JavaScript that it's okay to resume, so the next line will now be executed... 
    print("world"); 
} 

"रोक"/"तोड़ने" भाग एक जावा समारोह बंधन और यह वर्तमान ScriptEngine के लिए एक संदर्भ गुजर शामिल है या जो कुछ भी, कि अगर मेरे साथ शांत मैं सोच रहा हूं कि इसमें शायद यह शामिल होगा: जावास्क्रिप्ट को जावा के भीतर से रोकना।

मैंने कुछ googling किया और पाया कि यहां कीवर्ड "निरंतरता" प्रतीत होता है। जो मैं बता सकता हूं, राइनो केवल व्याख्या मोड (बनाम संकलित मोड) में निरंतरता का समर्थन करता है, जिसे मैं "संदर्भ" से 2 तक सेट करके पूरा करता हूं। चूंकि अंतर्निहित जेडीके स्क्रिप्टइंजिन संदर्भों के बारे में कुछ भी नहीं बताता है (या शायद मैं इसे याद कर रहा हूं), क्या इसका मतलब है कि मुझे मोज़िला की राइनो लाइब्रेरी को सीधे डाउनलोड करना और उपयोग करना है?

और राइनो निरंतरता क्या मैं इसे पूरा करने की जरूरत है? मुझे राइनो निरंतरता पर a useful tutorial मिला है, लेकिन इसके माध्यम से पढ़ने के बाद, मैं 100% निश्चित नहीं हूं कि यह ऊपर वर्णित किए गए कार्यों को पूरा करने में सक्षम होगा। इसका मतलब यह है कि जब मैं अपने स्क्रिप्ट को फिर से शुरू, सभी चर सेट नहीं किया गया है जाएगा, जब तक मैं उन्हें क्रमानुसार: यदि यह है मैं क्या देख रहा हूँ, तो मेरे अनुवर्ती सवाल "क्रमबद्धता" उल्लेख के बारे में है?

अद्यतन: ऐसा लगता है कि यह राइनो के साथ संभव है। मेरी जावास्क्रिप्ट में अब तक जो कुछ है, वह यहां है; कोड के बाद, मैं समझाऊंगा यह क्या करता है ...

var end = new Continuation(); 

function myJSFunction() 
{ 
    print("Hello "); 
    var kont = new Continuation(); 
    storePause(script, kont); // script is previously bound by Java into the JavaScript. it is a reference to the script itself. 
    end(); 
    print("world"); 

} 

मेरे "storePause()" समारोह है, यह एक जावा समारोह जो मैं लिखा है है, और यह जावास्क्रिप्ट के लिए बाध्य है, लेकिन अभी कुछ नहीं करता मेरा अगला लक्ष्य अपने कोड को बाहर निकालना होगा जैसे कि यह निरंतरता और स्क्रिप्ट जानकारी को जावा ऑब्जेक्ट्स के रूप में संग्रहीत करता है, ताकि जावा बाद में स्क्रिप्ट को फिर से शुरू कर सके।

अभी, यह क्या कर रहा है "हैलो" मुद्रित होने के बाद स्क्रिप्ट को रोकना/"तोड़ना" है, लेकिन "दुनिया" से पहले मुद्रित होने से पहले, यह मुझे साबित करता है कि इस तरह एक स्क्रिप्ट को रोकना संभव है।

तो, इस बिंदु पर पता लगाने के लिए मुझे जो कुछ छोड़ना चाहिए, वह एक निरंतरता को फिर से शुरू करना है। ध्यान दें कि उपरोक्त काम जेडीके स्क्रिप्टिंग इंजन का डिफ़ॉल्ट रूप से उपयोग करते हैं (मुझे इस बिंदु पर संकलित मोड बनाम संकलित मोड के बारे में चिंता करने की आवश्यकता नहीं है - यह व्याख्या मोड के लिए डिफ़ॉल्ट प्रतीत होता है), लेकिन ऐसा लगता है कि एक स्क्रिप्ट को फिर से शुरू करने की प्रक्रिया मोज़िला की राइनो लाइब्रेरी की आवश्यकता होगी।

उत्तर

5

ठीक है, मुझे दस्तावेज़, ट्यूटोरियल और उदाहरणों के माध्यम से खुदाई करने में कई घंटे लग गए, और यहां और Rhino Google Group पर पोस्टिंग भी हुई, लेकिन मैंने एक कामकाजी समाधान संकलित करने में कामयाब रहा है। चूंकि ऐसा कोई पूरा उदाहरण नहीं लगता है, इसलिए मैं अपने निष्कर्ष यहां किसी भी व्यक्ति के लिए पोस्ट करूंगा जो भविष्य में इस पर फंसे हुए हैं।

वास्तव में, मेरी निष्कर्ष शायद बहुत लंबा यहाँ पोस्ट करने के लिए कर रहे हैं, इसलिए मैं अपने ब्लॉग पर एक ट्यूटोरियल ऊपर लिखने का फैसला किया:

http://www.joshforde.com/blog/?p=7

आशा है कि किसी को मदद मिलती है। जहां तक ​​मुझे पता है, यह एकमात्र पूर्ण राइनो ट्यूटोरियल है जो दिखाता है कि निम्न में से सभी को कैसे करें: राइनो को प्रारंभ करें, जावास्क्रिप्ट (* .js) फ़ाइल से एक स्क्रिप्ट लोड करें, स्वचालित रूप से किसी विशेष जावा क्लास में सभी फ़ंक्शंस को बाध्य करें (उदाहरण के लिए स्क्रिप्टफंक्शन) जावास्क्रिप्ट में वैश्विक कार्यों के रूप में, और अंततः एक जावास्क्रिप्ट फ़ंक्शन को कॉल करें और उस कॉल के लिए निरंतरता को संभालें।

मूल रूप से, समस्या मैं पहली बार मोज़िला राइनो स्रोत कोड डाउनलोड करने के लिए (संस्करण JDK साथ में पैक पुरानी हो चुकी है और निरंतरता का समर्थन नहीं करता क्योंकि), सरकारी उपयोग करने के लिए मेरे कोड के सभी को फिर से लिखने की जरूरत है कि था राइनो पैकेज का सिंटैक्स (यह जेडीके के स्क्रिप्टिंगइंजिन सिंटैक्स से बहुत अलग है), एक जावा फ़ंक्शन लिखें जो निरंतरता अपवाद को फेंकता है और इसे जावास्क्रिप्ट से बांधता है ताकि जावास्क्रिप्ट इसे कॉल कर सके (क्योंकि जावास्क्रिप्ट परिणामों से सीधे जारी रखने के लिए एक निरंतरता फेंकना एक जावास्क्रिप्ट अपवाद में फेंक दिया गया है, न कि निरंतरता को फेंक दिया जा रहा है, और यहां तक ​​कि उस जावास्क्रिप्ट एक्सेप्शन परिणामों पर getCause() को कॉल करने का प्रयास कर रहा है, और फिर मेरे जावा कोड में जो मेरे जावास्क्रिप्ट फ़ंक्शन (मेरे मूल उदाहरण में "myJSFunction" को कॉल करता है, को जांचने के लिए ब्लॉक/प्रयास करें निरंतरता (whi ch एक अपवाद है), और फिर स्क्रिप्ट को फिर से शुरू करने के लिए उस निरंतरता का उपयोग करें।

पुhew। यह कठिन था, लेकिन अब यह सब कुछ लायक है।

+0

ब्लॉग साइट प्रतिक्रिया नहीं दे रही है। –

+1

@ जेसेग्लिक हेड-अप के लिए धन्यवाद। ऐसा लगता है कि मुझे अपनी साइट को किसी नए वेब सर्वर या कुछ स्थानांतरित करने की आवश्यकता है। इस बीच, यहां एक archive.org संस्करण है: https://web.archive.org/web/20130730231256/http://www.joshforde.com/blog/index.php/2011/12/tutorial-continuations-in -mozilla-राइनो एक जावास्क्रिप्ट-दुभाषिया के लिए जावा / – Josh1billion

-1

इंतजार/सूचित इस्तेमाल कर सकते हैं:

public final class Pause { 
    private final Object lock = new Object(); 

    public void await() throws InterruptedException { 
    synchronized (lock) { 
     lock.wait(); 
    } 
    } 

    public void resumeAll() { 
    synchronized (lock) { 
     lock.notifyAll(); 
    } 
    } 
} 

उपयोग:

final Pause pause = new Pause(); 

class Resumer implements Runnable { 
    @Override public void run() { 
    try { 
     Thread.sleep(5000); 
     pause.resumeAll(); 
    } catch (InterruptedException e) { 
     Thread.currentThread().interrupt(); 
    } 
    } 
} 
new Thread(new Resumer()).start(); 

SimpleBindings bindings = new SimpleBindings(); 
bindings.put("pause", pause); 
String script = "print('Hello, ');\n" 
       + "pause.await();\n" 
       + "println('ECMAScript!');\n"; 
new ScriptEngineManager().getEngineByName("ECMAScript") 
         .eval(script, bindings); 

यह एक अपेक्षाकृत साधारण समाधान आप किसी भी अन्य की कमी का उल्लेख नहीं है के रूप में है। wait() थ्रेड को अवरुद्ध करने का कारण बनता है, जो सभी वातावरण में स्वीकार्य नहीं होगा।Pause उदाहरण पर क्या थ्रेड इंतजार कर रहे हैं यह पहचानने का कोई आसान तरीका भी नहीं है यदि आप स्क्रिप्ट को एक साथ चलाने के लिए चाहते हैं।

नोट: await() पर InterruptedException या तो फोन करने वाले से या await() में अधिक समझदार कुछ कर रही द्वारा नियंत्रित किया जाना चाहिए।

+0

धन्यवाद, लेकिन जो मैं उपयोग करना चाहता हूं वह राइनो की वास्तविक "निरंतरता" कार्यक्षमता है। शोध और डिबगिंग के दिनों के बाद, मुझे अंत में यह पता चला कि इसे कैसे पूरा किया जाए, इसलिए मैं भविष्य में इस जानकारी की तलाश करने वाले किसी के लिए उत्तर पोस्ट करूंगा। – Josh1billion

0

आप की व्याख्या नहीं की थी तुम ऐसा क्यों कर रहे थे, लेकिन मैं इस तरह एक प्रोग्राम है जो एक अंत उपयोगकर्ता के साथ सूचना का आदान प्रदान की नकल किया गया था,:

print('Hello!'); 
a=Number(input('enter a number')); 
b=Number(input('and another number')); 
print('the sum of '+a+' plus '+b+' is '+(a+b)) 

मैं इसे एक प्रिंट बनाने के द्वारा सिर्फ काम कर रहा है और जावास्क्रिप्ट में एक इनपुट फ़ंक्शन जो प्रोग्राम स्थिति के लिए जांच करता है।

आप एक demo here.

यह सब जावास्क्रिप्ट में लिखा देख सकते हैं तो आप किसी भी ब्राउज़र के साथ स्रोत कोड देख सकते हैं।

आशा है कि यह

संबंधित मुद्दे