यह कभी काम नहीं कर सकता ।
async
कीवर्ड की अनुमति देता है await
एक समारोह के रूप में चिह्नित में इस्तेमाल किया जाएगा async
, लेकिन यह भी एक वादा जनरेटर में है कि समारोह बदल देता है। तो एक समारोह के साथ चिह्नित async
एक वादा वापस आ जाएगा। दूसरी ओर एक कंस्ट्रक्टर जिस वस्तु का निर्माण कर रहा है, उसे वापस करता है। इस प्रकार हमारे पास एक ऐसी स्थिति है जहां आप एक वस्तु और एक वादा दोनों लौटना चाहते हैं: एक असंभव स्थिति।
आप केवल async / प्रतीक्षा का उपयोग कर सकते हैं जहाँ आप वादों का उपयोग कर सकते हैं क्योंकि वे मूल रूप से वादों के लिए वाक्यविन्यास चीनी हैं। आप एक निर्माता में वादों का उपयोग नहीं कर सकते क्योंकि एक निर्माणकर्ता को निर्माण की गई वस्तु वापस करनी चाहिए, एक वादा नहीं।
इसे दूर करने के लिए दो डिज़ाइन पैटर्न हैं, दोनों का आविष्कार वादे से पहले हुआ था।
एक init()
फ़ंक्शन का उपयोग । यह jQuery की तरह एक सा काम करता है .ready()
। आपके द्वारा बनाई गई वस्तु का उपयोग केवल उसके स्वयं के init
या ready
कार्य के अंदर ही किया जा सकता है :
उपयोग:
var myObj = new myClass();
myObj.init(function() {
// inside here you can use myObj
});
कार्यान्वयन:
class myClass {
constructor () {
}
init (callback) {
// do something async and call the callback:
callback.bind(this)();
}
}
एक बिल्डर का उपयोग करें। मैंने इसका उपयोग जावास्क्रिप्ट में बहुत अधिक नहीं देखा है, लेकिन यह जावा में अधिक सामान्य वर्क-अराउंड में से एक है जब किसी ऑब्जेक्ट को अतुल्यकालिक रूप से निर्माण करने की आवश्यकता होती है। बेशक, बिल्डर पैटर्न का उपयोग ऑब्जेक्ट का निर्माण करते समय किया जाता है जिसमें बहुत अधिक जटिल मापदंडों की आवश्यकता होती है। जो कि एसिंक्रोनस बिल्डरों के लिए उपयोग-मामला है। अंतर यह है कि एक async बिल्डर एक वस्तु वापस नहीं करता है, लेकिन उस वस्तु का एक वादा:
उपयोग:
myClass.build().then(function(myObj) {
// myObj is returned by the promise,
// not by the constructor
// or builder
});
// with async/await:
async function foo () {
var myObj = await myClass.build();
}
कार्यान्वयन:
class myClass {
constructor (async_param) {
if (typeof async_param === 'undefined') {
throw new Error('Cannot be called directly');
}
}
static build () {
return doSomeAsyncStuff()
.then(function(async_result){
return new myClass(async_result);
});
}
}
Async / प्रतीक्षा के साथ कार्यान्वयन:
class myClass {
constructor (async_param) {
if (typeof async_param === 'undefined') {
throw new Error('Cannot be called directly');
}
}
static async build () {
var async_result = await doSomeAsyncStuff();
return new myClass(async_result);
}
}
ध्यान दें: हालांकि ऊपर दिए गए उदाहरणों में हम async बिल्डर के लिए वादों का उपयोग करते हैं वे कड़ाई से आवश्यक नहीं बोल रहे हैं। आप बस एक बिल्डर को आसानी से लिख सकते हैं जो कॉलबैक स्वीकार करता है।
स्थिर कार्यों के अंदर कॉलिंग फ़ंक्शन पर ध्यान दें।
यह async कंस्ट्रक्टर्स के साथ कुछ भी करने के लिए कुछ भी नहीं है, लेकिन कीवर्ड के साथ this
वास्तव में क्या मतलब है (जो उन भाषाओं से आने वाले लोगों के लिए थोड़ा आश्चर्यचकित हो सकता है जो विधि नामों के ऑटो-रिज़ॉल्यूशन करते हैं, अर्थात, वे भाषाएँ जिन्हें this
कीवर्ड की आवश्यकता नहीं है )।
this
कीवर्ड instantiated वस्तु को दर्शाता है। वर्ग नहीं। इसलिए आप आम तौर पर this
स्थैतिक कार्यों के अंदर उपयोग नहीं कर सकते क्योंकि स्थैतिक फ़ंक्शन किसी भी वस्तु के लिए बाध्य नहीं है, लेकिन सीधे वर्ग के लिए बाध्य है।
यह कहना है, निम्नलिखित कोड में:
class A {
static foo () {}
}
आप ऐसा नहीं कर सकते हैं:
var a = new A();
a.foo() // NOPE!!
इसके बजाय आपको इसे कॉल करने की आवश्यकता है:
A.foo();
इसलिए, निम्न कोड में त्रुटि होगी:
class A {
static foo () {
this.bar(); // you are calling this as static
// so bar is undefinned
}
bar () {}
}
इसे ठीक करने के लिए आप bar
या तो एक नियमित कार्य कर सकते हैं या एक स्थिर विधि:
function bar1 () {}
class A {
static foo () {
bar1(); // this is OK
A.bar2(); // this is OK
}
static bar2 () {}
}