ES2017 এর একটি বৈশিষ্ট্য অ্যাসিঙ্ক ফাংশন , প্রতিশ্রুতি ( অ্যাসিঙ্ক কোডের একটি নির্দিষ্ট ফর্ম) এবং await
কীওয়ার্ড ব্যবহার করে অ্যাসিঙ্ক কোডটিকে সিঙ্ক তৈরি করে । এছাড়াও কীওয়ার্ডের async
সামনের কীওয়ার্ডের নীচে কোড উদাহরণগুলিতে লক্ষ্য করুন function
যা একটি async / প্রতীক্ষা ফাংশনটিকে বোঝায়। await
শব্দ একটি ফাংশন সঙ্গে প্রাক নির্দিষ্ট হচ্ছে ছাড়া কাজ করবে না async
শব্দ। যেহেতু বর্তমানে এর ব্যতিক্রম নেই তার অর্থ কোনও শীর্ষ স্তরের অপেক্ষা করা কাজ করবে না (শীর্ষ স্তরের অপেক্ষার অর্থ কোনও ফাংশনের বাইরে অপেক্ষা করা)। যদিও শীর্ষ-স্তরের প্রস্তাব রয়েছেawait
।
ES2017 বিষয়টিকে স্বীকৃতি দেওয়া হয় (অর্থাত চূড়ান্ত) জুন 27 শে জাভাস্ক্রিপ্ট জন্য আদর্শ হিসাবে, 2017. এসিঙ্ক অপেক্ষায় রয়েছেন may ইতিমধ্যেই আপনার ব্রাউজারে কাজ, কিন্তু যদি না আপনি এখনও মত একটি জাভাস্ক্রিপ্ট transpiler ব্যবহার কার্যকারিতা ব্যবহার করতে পারেন Babel বা traceur । ক্রোম 55 এর অ্যাসিঙ্ক ফাংশনগুলির সম্পূর্ণ সমর্থন রয়েছে। সুতরাং আপনার যদি নতুন ব্রাউজার থাকে তবে আপনি নীচের কোডটি ব্যবহার করে দেখতে সক্ষম হতে পারেন।
দেখুন kangax এর es2017 সামঞ্জস্য টেবিলব্রাউজারের সামঞ্জস্যের জন্য ।
এখানে অ্যাসিঙ্কের অপেক্ষার ফাংশনটির একটি উদাহরণ বলা হয়েছে 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();
প্রত্যাশিত কীওয়ার্ডটি যখন প্রতিশ্রুতি মানের আগে স্থাপন করা হয় (এই ক্ষেত্রে প্রতিশ্রুতির মানটি ফাংশন ডসোমিংথিংসেঙ্ক দ্বারা ফিরিয়ে দেওয়া মান হয়) প্রতীক্ষিত কীওয়ার্ডটি ফাংশন কলটির কার্যকারিতা থামিয়ে দেবে, তবে এটি অন্য কোনও ক্রিয়াকলাপ থামিয়ে দেয় না এবং এটি অবিরত থাকবে প্রতিশ্রুতি সমাধান না হওয়া পর্যন্ত অন্যান্য কোড কার্যকর করা। প্রতিশ্রুতি সংশোধন করার পরে এটি প্রতিশ্রুতির মানটি আবদ্ধ করবে এবং আপনি এখন অপেক্ষা করা এবং প্রতিশ্রুতি প্রকাশের কথা ভাবতে পারেন যেহেতু সেই আনারপ্যাড মানটি প্রতিস্থাপন করা হচ্ছে।
সুতরাং, যেহেতু অপেক্ষা করুন কেবলমাত্র বিরতি অপেক্ষা করুন তারপরে লুপ এবং অভ্যন্তরীণ ফাংশন কলের জন্য এটি ব্যবহার করতে পারেন বাকী রেখার চালানোর আগে একটি মান আনপ্রেপ করে যা নীচে উদাহরণস্বরূপ যা অ্যারেতে অপেক্ষা করা সময়ের পার্থক্য সংগ্রহ করে এবং অ্যারেটি মুদ্রণ করে।
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)
})
অ্যাসিঙ্ক ফাংশনটি নিজেই একটি প্রতিশ্রুতি দেয় যাতে আপনি এটিকে শৃঙ্খলাবদ্ধ হয়ে প্রতিশ্রুতি হিসাবে ব্যবহার করতে পারেন যেমন আমি উপরে বা অন্য একটি অ্যাসিঙ্কের মধ্যে ফাংশনের জন্য অপেক্ষা করি।
উপরের ফাংশনটি অন্য অনুরোধ প্রেরণের আগে প্রতিটি প্রতিক্রিয়াটির জন্য অপেক্ষা করবে যদি আপনি একই সাথে অনুরোধগুলি প্রেরণ করতে চান তবে আপনি 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 / অপেক্ষার ফাংশনগুলি ধরার কলটিতে প্রচার করতে দিন। বিশেষত নোড.জেএস-এ প্রতিশ্রুতি ত্রুটিগুলি নিখরচায় না ফেলে আপনার সতর্ক হওয়া উচিত। নীচে কয়েকটি উদাহরণ দেওয়া আছে যা ত্রুটিগুলি কীভাবে কাজ করে তা দেখায়।
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) এর সাথে ব্যবহার করা যেতে পারে এর একটি বিকল্প হ'ল একটি জেনারেটর ফাংশন মোড়ানো একটি বিশেষ ফাংশন ব্যবহার করা। জেনারেটর ফাংশনগুলিতে একটি ফলন কীওয়ার্ড থাকে যা আশেপাশের ফাংশনটির সাথে প্রতীক্ষিত কীওয়ার্ডটির প্রতিরূপ করতে ব্যবহৃত হতে পারে। ফলন কীওয়ার্ড এবং জেনারেটরের ফাংশনটি অনেক বেশি সাধারণ উদ্দেশ্য এবং আরও অনেক কিছু করতে পারে তারপরে অ্যাসিঙ্কের অপেক্ষার ফাংশনটি কেবল তাই করে। আপনি যদি এমন একটি জেনারেটর ফাংশন মোড়ক চান যা অ্যাসিঙ্কের অপেক্ষার প্রতিরূপ করতে ব্যবহৃত হতে পারে তবে আমি co.js পরীক্ষা করে দেখতে চাই । যাইহোক সহ-এর ফাংশন যেমন async এর প্রত্যাশায় ফাংশনগুলি প্রতিশ্রুতি ফেরায়। সত্যই যদিও এই মুহুর্তে ব্রাউজারের সামঞ্জস্যতা উভয় জেনারেটর ফাংশন এবং অ্যাসিঙ্ক ফাংশনগুলির জন্য সমান তাই আপনি যদি কেবল অ্যাসিঙ্ক কার্যকারিতার জন্য অপেক্ষা করেন তবে আপনাকে co.js ছাড়াই অ্যাসিঙ্ক ফাংশন ব্যবহার করা উচিত if
IE ব্যতীত সমস্ত বড় বর্তমান ব্রাউজারগুলিতে (ক্রোম, সাফারি এবং এজ) অ্যাসিঙ্ক ফাংশনগুলির জন্য ব্রাউজার সমর্থনটি এখন বেশ ভাল।