2011-10-09 18 views
22

क्या async/ सी # 5.0 से किसी भी भाषा को फीचर करने का कोई प्रयास है जिसे जावास्क्रिप्ट (जैसे कॉफ़ीस्क्रिप्ट) में संकलित किया जा सकता है? (इसलिए इसका उपयोग वेब ब्राउज़र में या node.js. में किया जा सकता है)Async/वेब ब्राउज़र में या node.js में प्रतीक्षा करें?

+2

इन-ब्राउजर जावास्क्रिप्ट और जावास्क्रिप्ट node.js के माध्यम से एसिंक्रोनस प्रोग्रामिंग करने का अपना तरीका है। आप यह सीखने से बहुत बेहतर होंगे कि यह कैसे काम करता है और इसे एक अलग मॉडल में मजबूर करने की कोशिश करने के बजाय इसका उपयोग करता है (जो वैसे भी पूरी तरह से असंभव होने की संभावना है)। – Pointy

+9

@ पॉइंटी: सी # 5 का इंतजार एक ही कॉलबैक मॉडल के आसपास एक वाक्य रचनात्मक रैपर है। वे किसी भी भाषा में कॉलबैक की तुलना में ** अधिक ** उपयोग करना आसान हैं। – SLaks

+0

ठीक है मैं निश्चित रूप से आपके व्यापक अनुभव को रोकता हूं :-) – Pointy

उत्तर

7

मैं सी # से परिचित नहीं हूं, लेकिन ऐसा लगता है कि आप जो खोज रहे हैं वह कुछ प्रकार की निरंतरता है, ताकि लिखने की बजाय

fs.readFile 'foo.txt', (err, data) -> 
    myFunc data 

आप के बजाय सिर्फ

data = &fs.readFile 'foo.txt' # not a real syntax 
myFunc data 

की तरह कुछ लिख सकता है यह कुछ ऐसा है जावास्क्रिप्ट या CoffeeScript प्रदान करता है नहीं है। हालांकि, वहाँ कई अन्य compilers कि कुछ इस तरह कर सकते हैं: जावास्क्रिप्ट आधारित, सुविधाओं

  • coco का एक समूह कहते हैं - - जावास्क्रिप्ट आधारित, मुख्य रूप से सिर्फ इस सुविधा
  • Kaffeine कहते हैं

    • TameJS - कॉफीस्क्रिप्ट-आधारित

    यह भी देखें: List of languages that compile to JavaScript कॉफीस्क्रिप्ट विकी पर।

  • +0

    +1 Thx, कोको में यह कैसे करें? –

    +1

    कोको विकी पर "[बैककॉल] (https://github.com/satyr/coco/wiki/additions)" की तलाश करें। यह '<-' ऑपरेटर का उपयोग करता है। –

    +2

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

    1

    यदि आप जावास्क्रिप्ट के लिए .NET शैली एसिंक्रोनस प्रोग्रामिंग में रुचि रखते हैं तो आपको जावास्क्रिप्ट के लिए आरएक्स में देखना चाहिए। JavaScrpt के लिए आरएक्स प्रतिक्रियाशील फ्रेमवर्क का माइक्रोसॉफ्ट का जावास्क्रिप्ट पोर्ट है। प्रतिक्रियाशील ढांचे के रूप में वर्णित है:

    एक पुस्तकालय नमूदार संग्रह और LINQ शैली क्वेरी ऑपरेटर्स का उपयोग अतुल्यकालिक और घटना आधारित प्रोग्राम की रचना करने के।

    आप जावास्क्रिप्ट here

    के लिए आरएक्स डाउनलोड कर सकते हैं और आप इसके बारे में और अधिक पढ़ सकते here

    तुम भी NPM साथ नोड पर स्थापित कर सकते हैं उदाहरण सहित:

    NPM स्थापित आरएक्स

    यह काम करता है jQuery जैसे पुस्तकालयों के साथ, हालांकि मैं कॉफीस्क्रिप्ट प्रोग्रामर नहीं हूं, इसलिए मुझे यकीन नहीं है कि इस भाषा में अन्य जावास्क्रिप्ट पुस्तकालयों के साथ अंतःक्रियाशीलता के लिए क्या समर्थन है।

    +0

    क्या जावास्क्रिप्ट के लिए आरएक्स async/प्रतीक्षा सुविधा प्रदान करता है? –

    16

    Async जावास्क्रिप्ट सद्भाव के लिए सुविधा सूची पर है। अब तक वहाँ ब्राउज़र में या नोड में इस तरह के सुविधा प्रदान करने के कई प्रयास कर रहे हैं, उनमें से कोई भी सद्भाव प्रस्ताव यद्यपि के साथ संगत होने लगते हैं:

    • Async JS1.7 जनरेटर (task.js देखें) के साथ नकली जा सकता है। अभी तक V8 (without experimental mode) द्वारा ऑफ़-द-बॉक्स का समर्थन नहीं किया गया है, लेकिन एफएफ में काम करता है। संभावित रूप से traceur या Masacra कंपाइलर जनरेटर को अन्य वातावरण में लाने के लिए उपयोग किया जा सकता है।
    • node-fibers पुस्तकालय नोड में असीमित प्रोग्रामिंग के लिए अन्य तंत्र प्रदान करता है (हालांकि प्रदर्शन को कम करता है)।V8cgi पर आधारित अन्य प्रयासों का वर्णन here है।
    • राइनो में अच्छे विकल्प प्रदान करने वाले बॉक्स के बाहर continuations है। यही कारण है कि Ringo.js देखने लायक हो सकता है।
    • जेएस 2 जेएस अनुवाद पर आधारित कुछ समाधान उपलब्ध हैं, उदाहरण: jscx, NarrativeJS, jwacs, StratifiedJS। नोड के साथ कुछ समर्थन एकीकरण।
    • सिंटैक्स को विस्तार किए बिना कॉलबैक समस्या को हल करने की कोशिश कर रहे कई वादे/भावी पुस्तकालय हैं, हालांकि वे सभी कंपोज़ेबिलिटी मुद्दों से पीड़ित हैं, यानी कॉलबैक में लूप जैसे भाषा संरचनाओं का उपयोग नहीं कर सकते हैं।
    +0

    +1 अधिक जानकारी के लिए धन्यवाद। –

    5

    हां वहाँ है, और आपको इसे संकलित करने की भी आवश्यकता नहीं है, क्योंकि यह केवल एक साधारण जावास्क्रिप्ट लाइब्रेरी है।

    sharpnr.js नामक मेरी परियोजनाओं में से एक का उद्देश्य सी # (और पाठ्यक्रम के .NET) की महान विशेषताओं के साथ जावास्क्रिप्ट को विस्तारित करना है जैसे प्रतीक्षा/एसिंक, या LINQ।

    लाइब्रेरी वर्तमान में बीटा में है, लेकिन यह स्थिर है और लगभग हर कथन का समर्थन करता है (उदाहरण के लिए लूप, स्विच, अगर), और मौजूदा पुस्तकालयों (जैसे jQuery) के साथ अच्छी तरह से काम करता है।

    इंतजार/async वाक्य रचना सी # संस्करण के लगभग समान है:

    var getAsync = async(function(url) { 
        var result = await; $.get(url); 
        $("#test").html(result); 
    }); 
    getAsync("http://www.sharpnrjs.com"); 
    

    jsfiddle पर उदाहरण कार्य करना।

    आप लाइब्रेरी को github से डाउनलोड कर सकते हैं।

    2

    पूर्णता के लिए: मैंने पाया है कि Saltarelle Compiler (जो वास्तव में सी # को जावास्क्रिप्ट में संकलित करता है) भी प्रतीक्षा/async का समर्थन करता है।

    4

    जब नोड 0.11 (with v8 3.19 [1], which has generators[2]) आता है, तो आप Galaxy और नीचे दिए गए कोड का उपयोग कर सकते हैं।

    हालांकि, केवल ध्वज के पीछे। वे supported natively in ioJS हैं।

    function* countLines(path) { 
        var names = yield fs.readdir(path); 
        var total = 0; 
        for (var i = 0; i < names.length; i++) { 
         var fullname = path + '/' + names[i]; 
         if ((yield fs.stat(fullname)).isDirectory()) { 
          total += yield countLines(fullname); 
         } else { 
          var count = (yield fs.readFile(fullname, 'utf8')).split('\n').length; 
          console.log(fullname + ': ' + count); 
          total += count; 
         } 
        } 
        return total; 
    } 
    
    function* projectLineCounts() { 
        var total = 0; 
        total += yield countLines(__dirname + '/../examples'); 
        total += yield countLines(__dirname + '/../lib'); 
        total += yield countLines(__dirname + '/../test'); 
        console.log('TOTAL: ' + total); 
        return total; 
    } 
    
    +0

    +1 Thx, node.js में समाधान के लिए और उम्मीद है कि आधुनिक ब्राउज़र :) –

    0

    वहाँ https://github.com/loveencounterflow/coffy-script जो CoffeeScript को yield जोड़ने के लिए प्रयास है। कॉफ़ीस्क्रिप्ट बहुत नया है और जैसा कि मैं इसे लिख रहा हूं, मैं require.extensions वैश्विक स्तर पर होने वाली कठिनाइयों पर विचार कर रहा हूं, और क्या मुझे एक अलग एक्सटेंशन होना चाहिए। उस ने कहा, कॉफ़ीस्क्रिप्ट काम करता है, और आप मेरे जीथब पेज पर कई उदाहरण पाएंगे जो दिखाते हैं कि suspend, resume, और yield का उपयोग करके काफी संक्षिप्त असीमित कोड कैसे लिखना है।

    दिया गया है कि yield नोडजेएस 11.2 में पहुंचा है, मुझे विश्वास है कि हमें शोध करना चाहिए कि जेनरेटर/कोरआउट्स का उपयोग एसिंक्रोनस प्रोग्रामिंग को और अधिक आकर्षक बनाने के लिए कैसे करना चाहिए। मैंने किसी के लिए वादे फेंक दिया है, उनके साथ अनुभव इतना सुखद नहीं रहा है। फिर फिर, yield सभी प्रमुख ब्राउज़रों में उपलब्ध होने में कुछ समय लग सकता है।

    3

    आप हो सकता है async/इंतजार प्रायोगिक जे एस ध्वज सक्षम के साथ गूगल क्रोम में, का उपयोग कर निर्मित जेनरेटर, वादे और एक छोटे से spawn() function by Jake Archibald:

    spawn(function*() { //this function is async 
         let story = yield getJSON('story.json'); //yield is like await 
         addHtmlToPage(story.heading); 
    }); 
    

    वैकल्पिक रूप से, आप का उपयोग कर सकते हैं:

    ES6 का समर्थन नहीं ब्राउज़रों के लिए, वहाँ Facebook Regenerator है।

    13

    async/प्रतीक्षा coming in ECMAScript 7 होने लगता है। यह proposal जनवरी 2014 में विनिर्देशन प्रक्रिया के चरण 1 में स्वीकार किया गया था।

    अच्छी खबर यह है कि Googles traceur compiler पहले से ही इसका समर्थन करता है, ताकि आप आज इसका उपयोग शुरू कर सकें।

    नमूना वाक्य रचना:

    async function asyncValue(value) { 
        await timeout(50); 
        return value; 
    } 
    

    async/इंतजार TypeScript roadmap पर भी है।

    +0

    बस किसी को ड्राफ्ट प्रस्ताव के लिए सीधे लिंक चाहिए https://tc39.github.io/ecmascript-asyncawait/ –

    +2

    प्रतीक्षा नोड के साथ खत्म हो गई है v7.0.0, अच्छी तरह से [लगभग] (https://github.com/nodejs/promises/issues/4#issuecomment-251025934) – mido

    3

    अच्छी खबर,

    NodeJS v7.0.0 से इसका समर्थन करता है (अच्छी तरह से, आंशिक रूप से), अभी भी एक सद्भाव झंडा --harmony_async_await की जरूरत है, और जाहिरा तौर पर more details के लिए, स्मृति रिसाव सहित कुछ कीड़े है, लेकिन वहाँ कुछ चिंताएं हैं साथ ही, और एक टिप्पणीकर्ता advises v8 संस्करण 55 तक प्रतीक्षा करने के लिए जो लंबे समय तक नहीं हो सकता है।

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