عموما دا دوه کلیدي کلمې لري: async او انتظار. لومړۍ کلمه فنکشن په اسینکرونس بدلوي. دا ډول دندې د انتظار کارولو ته اجازه ورکوي. په بل هر حالت کې، د دې فنکشن کارول به یوه تېروتنه رامنځته کړي.
// With function declaration
async function myFn() {
// await ...
}
// With arrow function
const myFn = async () => {
// await ...
}
function myFn() {
// await fn(); (Syntax Error since no async)
}
Async د فنکشن اعلامیې په پیل کې دننه کیږي، او د تیر فنکشن په صورت کې، د "=" نښه او قوس ترمنځ.
// As an object's method
const obj = {
async getName() {
return fetch('https://www.example.com');
}
}
// In a class
class Obj {
async getResource() {
return fetch('https://www.example.com');
}
}
نو! دا د یادولو وړ ده چې د ټولګي جوړونکي او ګیټرز/سیټرونه غیر متناسب نه وي.
const p = Promise.resolve('hello')
p instanceof Promise;
// true
Promise.resolve(p) === p;
// true
مګر څه پیښیږي که چیرې د غیر متناسب فعالیت دننه کومه تېروتنه شتون ولري؟
async function foo() {
throw Error('bar');
}
foo().catch(console.log);
که دا پروسس نشي، foo() به د رد سره ژمنه بیرته راولي. په دې حالت کې، Promise.reject چې یوه تېروتنه لري د Promise.resolve پرځای بیرته راستانه شي.
د Async دندې تل یوه ژمنه تولیدوي، پرته له دې چې بیرته راستانه شي.
غیر متناسب افعال په هر انتظار کې ودریږي.
انتظار څرګندونه اغیزه کوي. نو، که بیان یوه ژمنه وي، د async فعالیت تر هغه پورې ځنډول کیږي تر څو چې ژمنه پوره نشي. که بیان ژمنه نه وي، دا د Promise.resolve له لارې په ژمنې بدلیږي او بیا بشپړیږي.
// utility function to cause delay
// and get random value
const delayAndGetRandom = (ms) => {
return new Promise(resolve => setTimeout(
() => {
const val = Math.trunc(Math.random() * 100);
resolve(val);
}, ms
));
};
async function fn() {
const a = await 9;
const b = await delayAndGetRandom(1000);
const c = await 5;
await delayAndGetRandom(1000);
return a + b * c;
}
// Execute fn
fn().then(console.log);
او دلته د fn فنکشن څنګه کار کوي تشریح دی.
د زنګ وهلو وروسته، لومړۍ کرښه له const a = await 9 څخه بدلیږي. in const a = انتظار وکړئ Promise.resolve(9);
د انتظار کارولو وروسته، د فعالیت اجرا کول تر هغه پورې ځنډول کیږي تر هغه چې یو خپل ارزښت ترلاسه کړي (په اوسني حالت کې دا 9 دی).
delayAndGetRandom(1000) د fn فنکشن اجرا کول ودروي تر هغه چې دا پخپله بشپړ نشي (د 1 ثانیې وروسته). دا په مؤثره توګه د 1 ثانیو لپاره د fn فعالیت ودروي.
delayAndGetRandom(1000) د حل له لارې یو تصادفي ارزښت راګرځوي، کوم چې بیا متغیر b ته ټاکل کیږي.
ښه، د متغیر c سره قضیه د متغیر الف سره قضیه سره ورته ده. له هغې وروسته ، هرڅه د یوې ثانیې لپاره ودریږي ، مګر اوس ځنډول او ګیټ رینډم (1000) هیڅ شی نه راګرځوي ځکه چې دا اړین ندي.
د پایلې په توګه، ارزښتونه د فورمول a + b * c په کارولو سره محاسبه کیږي. پایله د Promise.resolve په کارولو سره په ژمنه کې پوښل شوې او د فنکشن لخوا بیرته راستانه شوې.
دا وقفې ممکن په ES6 کې د جنراتورونو یادونه وکړي ، مګر پدې کې یو څه شتون لري ستاسو دلایل.
د ستونزې حل کول
ښه، اوس راځئ چې د پورته ذکر شوي ستونزې حل وګورو.
د FinishMyTask فنکشن د عملیاتو پایلو ته انتظار کولو لپاره انتظار کاروي لکه د پوښتنې ډیټابیس ، بریښنالیک لیږل ، logTaskInFile ، او نور. که تاسو دا حل له هغه سره پرتله کړئ چیرې چې ژمنې کارول شوې وې ، ورته والی به څرګند شي. په هرصورت، د Async/Await نسخه ټول ترکیبي پیچلتیاوې خورا ساده کوي. په دې حالت کې، د کال بیکونو او زنځیرونو لوی شمیر شتون نلري لکه .then/.catch.
async function canRejectOrReturn() {
// wait one second
await new Promise(res => setTimeout(res, 1000));
// Reject with ~50% probability
if (Math.random() > 0.5) {
throw new Error('Sorry, number too big.')
}
return 'perfect number';
}
canRejectOrReturn() یو غیر متناسب فنکشن دی چې یا بریالی کیږي ("بشپړ شمیر") یا د غلطۍ سره ناکام کیږي ("بخښنه، شمیره ډیره لویه").
دا د دې حقیقت په پام کې نیولو سره ارزښت لري چې په مثال کې، canRejectOrReturn د foo څخه راستانه شوی. فو په دې حالت کې یا د بشپړ شمیرې سره پای ته رسیږي یا یوه تېروتنه راګرځوي ("بخښنه، شمیره ډیره لویه"). د کیچ بلاک به هیڅکله اعدام نشي.
ستونزه دا ده چې foo هغه ژمنه بیرته راګرځوي چې له canRejectOrReturn څخه تیریږي. نو د foo حل د canRejectOrReturn لپاره حل کیږي. په دې حالت کې، کوډ به یوازې دوه کرښې ولري:
لکه څنګه چې تاسو لیدلی شئ، په کوډ کې هیڅ انتظار یا بیرته ستنیدل شتون نلري. له همدې امله foo تل د 1 ثانیې ځنډ پرته د نه تعریف شوي سره وځي. خو وعده به پوره کوي. که دا کومه تېروتنه یا رد کړي، نو د UnhandledPromiseRejectionWarning به ویل کیږي.