2013-05-22 7 views
8

में हैंडलस्कोप का सही उपयोग मैं एक एसिंक्रोनस नोड एडन लिख रहा हूं, लेकिन मुझे पता लगाने के लिए संघर्ष कर रहा है कि मुझे "आफ्टर" फ़ंक्शन में हैंडलस्कोप का उपयोग करने की आवश्यकता है जो क्लाइंट जावास्क्रिप्ट कॉलबैक को कॉल करता है। मैंने नए स्कॉप्स के साथ और बिना दिखाए गए उदाहरण देखे हैं, लेकिन कभी भी कोई स्पष्टीकरण क्यों नहीं।असिंक्रोनस एडन

void asyncWorkAfter(uv_work_t* req) { 
    HandleScope scope; // <-- Do you need a new scope? 

    const int argc = 1; 
    Local<Value> foo = String::New("foo"); 
    Local<Value> argv[] = { foo }; 

    // assume I got my callback function out of req 
    callback->Call(Context::GetCurrent()->Global(), argc, argv); 

    callback.Dispose(); 

    // if i use a new HandleScope, what happens to argv when we go out of scope? 
    // Do i need to do something like a scope.Close() to copy argv to the parent scope? 
} 

आप की जरूरत/एक HandleScope चाहते हैं जब आप कॉलबैक फोन करें: यहाँ एक उदाहरण है?
यदि आप एक नया हैंडलस्कोप का उपयोग करते हैं तो उदाहरण में argv का क्या होता है?

+1

मेरे understaning है कि आप हर बार HandleScope, स्थानीय लोगों को ठीक से एकत्र होने के लिए अनुमति देता है कि आप लोकल का उपयोग की जरूरत है। –

उत्तर

1

String::New("foo") ढेर पर कुछ आवंटित करेगा और एक हैंडल वापस करेगा, इसलिए आपको इस संभाल से संदर्भित स्मृति को कुछ मुक्त करने की आवश्यकता है। यदि आप उन्हें HandleScope v8 से जोड़ते हैं तो आपके लिए यह सब कुछ होगा जब सभी संदर्भ शून्य पर गिने जाते हैं।

स्थानीय हैंडल स्टैक पर आयोजित किए जाते हैं और हटाए जाते हैं जब उचित विनाशक कहा जाता है। ये हैंडल का जीवनकाल हैंडल स्कोप द्वारा निर्धारित किया जाता है, जिसे अक्सर कॉल की शुरुआत में बनाया जाता है। जब हैंडल स्कोप हटा दिया जाता है, तो कचरा कलेक्टर को हैंडल स्कोप में हैंडल द्वारा संदर्भित उन ऑब्जेक्ट्स को डिलीकेट करने के लिए निशुल्क है, बशर्ते वे जावास्क्रिप्ट या अन्य हैंडल से अब तक पहुंच योग्य न हों।

https://developers.google.com/v8/embed

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