Async फ़ंक्शन , ES2017 में एक सुविधा , वादे (async कोड का एक विशेष रूप) और await
कीवर्ड का उपयोग करके async कोड को सिंक करते हैं । इसके अलावा कीवर्ड नीचे कोड उदाहरण में नोटिस async
के सामनेfunction
कि एसिंक्स / वेट फ़ंक्शन को दर्शाता है। await
कीवर्ड एक समारोह के साथ पहले से तय में किया जा रहा बिना काम नहीं करेगा async
कीवर्ड। चूंकि वर्तमान में इसका कोई अपवाद नहीं है, जिसका अर्थ है कि कोई शीर्ष स्तर प्रतीक्षा नहीं करेगा (शीर्ष स्तर किसी भी फ़ंक्शन के बाहर प्रतीक्षा का अर्थ है)। हालांकि शीर्ष स्तर के लिएawait
एक प्रस्ताव है ।
ES2017 को 27 जून, 2017 को जावास्क्रिप्ट के लिए मानक के रूप में (यानी अंतिम रूप दिया गया) प्रमाणित किया गया था। Async प्रतीक्षा आपके ब्राउज़र में पहले से ही काम कर सकती है, लेकिन यदि आप अभी भी जावास्क्रिप्ट ट्रांसपिलर का उपयोग करके कार्यक्षमता का उपयोग नहीं कर सकते हैं जैसे कोलाहल या Traceur । Chrome 55 में async फ़ंक्शंस का पूरा समर्थन है। इसलिए यदि आपके पास एक नया ब्राउज़र है, तो आप नीचे दिए गए कोड को आज़मा सकते हैं।
देख ब्राउज़र संगतता के लिए kangax की es2017 संगतता तालिका ।
यहाँ एक उदाहरण async वेट फंक्शन है जिसे doAsync
तीन एक दूसरा पॉज़ कहते हैं और शुरू से प्रत्येक पॉज़ के बाद समय के अंतर को प्रिंट करता है:
function timeoutPromise (time) {
return new Promise(function (resolve) {
setTimeout(function () {
resolve(Date.now());
}, time)
})
}
function doSomethingAsync () {
return timeoutPromise(1000);
}
async function doAsync () {
var start = Date.now(), time;
console.log(0);
time = await doSomethingAsync();
console.log(time - start);
time = await doSomethingAsync();
console.log(time - start);
time = await doSomethingAsync();
console.log(time - start);
}
doAsync();
जब प्रतीक्षित कीवर्ड को एक वादा मूल्य से पहले रखा जाता है (इस मामले में वादा मूल्य फ़ंक्शन doSomethingAsync द्वारा वापस लौटाया जाता है) प्रतीक्षित कीवर्ड फ़ंक्शन कॉल के निष्पादन को रोक देगा, लेकिन यह किसी भी अन्य फ़ंक्शन को रोक नहीं पाएगा और यह जारी रहेगा वादा पूरा होने तक अन्य कोड निष्पादित करना। वादे के बाद, यह वादा के मूल्य को उजागर करेगा और आप इंतजार और वादा अभिव्यक्ति के बारे में सोच सकते हैं क्योंकि अब उस अलिखित मूल्य से प्रतिस्थापित किया जा रहा है।
इसलिए, जब से बस रुकने का इंतजार होता है, तब बाकी मूल्य को निष्पादित करने से पहले आप एक मान को खोल देते हैं, जिसका उपयोग आप लूप के लिए और अंदर के फंक्शन कॉल के लिए कर सकते हैं, जैसे नीचे दिए गए उदाहरण में, जो एक सरणी में प्रतीक्षित समय के अंतर को इकट्ठा करता है और सरणी को प्रिंट करता है।
function timeoutPromise (time) {
return new Promise(function (resolve) {
setTimeout(function () {
resolve(Date.now());
}, time)
})
}
function doSomethingAsync () {
return timeoutPromise(1000);
}
// this calls each promise returning function one after the other
async function doAsync () {
var response = [];
var start = Date.now();
// each index is a promise returning function
var promiseFuncs= [doSomethingAsync, doSomethingAsync, doSomethingAsync];
for(var i = 0; i < promiseFuncs.length; ++i) {
var promiseFunc = promiseFuncs[i];
response.push(await promiseFunc() - start);
console.log(response);
}
// do something with response which is an array of values that were from resolved promises.
return response
}
doAsync().then(function (response) {
console.log(response)
})
Async फ़ंक्शन अपने आप ही एक वादा लौटाता है, ताकि आप उस प्रतिज्ञा के रूप में उपयोग कर सकें जैसे मैं ऊपर या किसी अन्य async प्रतीक्षा फ़ंक्शन के भीतर करता हूँ।
उपरोक्त फ़ंक्शन प्रत्येक अनुरोध के लिए एक और अनुरोध भेजने से पहले प्रतीक्षा करेगा यदि आप अनुरोधों को समवर्ती रूप से भेजना चाहते हैं तो आप Promise.all का उपयोग कर सकते हैं ।
// no change
function timeoutPromise (time) {
return new Promise(function (resolve) {
setTimeout(function () {
resolve(Date.now());
}, time)
})
}
// no change
function doSomethingAsync () {
return timeoutPromise(1000);
}
// this function calls the async promise returning functions all at around the same time
async function doAsync () {
var start = Date.now();
// we are now using promise all to await all promises to settle
var responses = await Promise.all([doSomethingAsync(), doSomethingAsync(), doSomethingAsync()]);
return responses.map(x=>x-start);
}
// no change
doAsync().then(function (response) {
console.log(response)
})
यदि वादा संभवतः अस्वीकार करता है, तो आप इसे एक कोशिश में पकड़ सकते हैं या कोशिश करने वाले को छोड़ सकते हैं और त्रुटि को async / प्रतीक्षा कार्यों को पकड़ने के लिए प्रचारित करने दें। विशेष रूप से Node.js. में अनचाहे किए गए वादों को छोड़ने के लिए आपको सावधान रहना चाहिए नीचे कुछ उदाहरण दिए गए हैं जिनसे पता चलता है कि त्रुटियाँ कैसे काम करती हैं।
function timeoutReject (time) {
return new Promise(function (resolve, reject) {
setTimeout(function () {
reject(new Error("OOPS well you got an error at TIMESTAMP: " + Date.now()));
}, time)
})
}
function doErrorAsync () {
return timeoutReject(1000);
}
var log = (...args)=>console.log(...args);
var logErr = (...args)=>console.error(...args);
async function unpropogatedError () {
// promise is not awaited or returned so it does not propogate the error
doErrorAsync();
return "finished unpropogatedError successfully";
}
unpropogatedError().then(log).catch(logErr)
async function handledError () {
var start = Date.now();
try {
console.log((await doErrorAsync()) - start);
console.log("past error");
} catch (e) {
console.log("in catch we handled the error");
}
return "finished handledError successfully";
}
handledError().then(log).catch(logErr)
// example of how error propogates to chained catch method
async function propogatedError () {
var start = Date.now();
var time = await doErrorAsync() - start;
console.log(time - start);
return "finished propogatedError successfully";
}
// this is what prints propogatedError's error.
propogatedError().then(log).catch(logErr)
अगर आप यहां जाएं तो आप आगामी ECMAScript संस्करणों के लिए तैयार प्रस्तावों को देख सकते हैं।
इसका एक विकल्प जो सिर्फ ES2015 (ES6) के साथ इस्तेमाल किया जा सकता है वह एक विशेष फ़ंक्शन का उपयोग करना है जो एक जनरेटर फ़ंक्शन को लपेटता है। जेनरेटर फ़ंक्शंस में एक उपज कीवर्ड होता है जिसका उपयोग आस-पास के फ़ंक्शन के साथ प्रतीक्षा कीवर्ड को दोहराने के लिए किया जा सकता है। उपज कीवर्ड और जनरेटर फ़ंक्शन एक बहुत अधिक सामान्य उद्देश्य हैं और कई और चीजें कर सकते हैं फिर बस async प्रतीक्षा कार्य करता है। यदि आप एक जनरेटर फंक्शन रैपर चाहते हैं, जिसका उपयोग async प्रतीक्षा करने के लिए किया जा सकता है तो मैं co.js की जाँच करूँगा । वैसे, सह का कार्य जैसे कि async प्रतीक्षा कार्य एक वादा वापस करते हैं। ईमानदारी से, हालांकि इस बिंदु पर ब्राउज़र की संगतता जनरेटर कार्यों और async दोनों कार्यों के लिए समान है, इसलिए यदि आप सिर्फ async प्रतीक्षा कार्यशीलता चाहते हैं तो आपको co.js.s के बिना Async फ़ंक्शन का उपयोग करना चाहिए।
IE को छोड़कर सभी प्रमुख वर्तमान ब्राउज़रों (क्रोम, सफारी और एज) में Async फ़ंक्शंस (2017 के अनुसार) के लिए ब्राउज़र समर्थन वास्तव में अब बहुत अच्छा है।