تعابير تعريف الدوال غير المتزامنة في JavaScript
الكلمة المحجوزة async function
تُستخدَم لتعريف دوال غير متزامنة ضمن تعبير (expression).
طريقة أخرى لتعريف الدوال غير المتزامنة في JavaScript هي التصريح عنها.
البنية العامة
async function name([param[, param[, ... param]]]) {
statements
}
name
اسم الدالة، ويمكن حذفه وحينئذٍ ستسمى الدالة بالدالة المجهولة؛ واسم الدالة لن يكون متاحًا إلا داخل الدالة نفسها (يمكن أن يستعمل لتنفيذها تعاوديًا [recursively]).
param
اسم الوسيط المُرَّر إلى الدالة.
statements
التعابير البرمجية التي تُشكِّل جسم الدالة.
الوصف
تعابير تعريف الدوال غير المتزامنة تشبه كثيرًا (وتكاد تماثل) طريقة التصريح عن الدوال غير المتزامنة (function declaration)، والفرق الرئيسي بينهما هو اسم الدالة، الذي يمكن حذفه في تعابير تعريف الدوال غير المتزامنة لإنشاء دوال مجهولة (anonymous function)؛ ويمكن أن استدعاء تعبير تعريف الدالة مباشرةً (ويسمى ذلك Immediately Invoked Function Expression اختصارًا IIFE) مما يؤدي إلى تنفيذ الدالة بعد تعريفها مباشرةً.
أمثلة
مثال بسيط
function resolveAfter2Seconds(x) {
return new Promise(resolve => {
setTimeout(() => {
resolve(x);
}, 2000);
});
};
var add = async function(x) { // تعبير دالة غير متزامنة مُسنَد إلى متغير
var a = await resolveAfter2Seconds(20);
var b = await resolveAfter2Seconds(30);
return x + a + b;
};
add(10).then(v => {
console.log(v); // إظهار 60 بعد 4 ثواني
});
(async function(x) { // async function expression used as an IIFE
var p_a = resolveAfter2Seconds(20);
var p_b = resolveAfter2Seconds(30);
return x + await p_a + await p_b;
})(10).then(v => {
console.log(v); // إظهار 60 بعد 2 ثواني
});
لاحظ أنَّ التنفيذ قد توقف لمدة ثانيتن في الدالة الأولى لأوّل await
وثم توقف لثانيتن أخرتين لثاني await
؛ ذلك لأنَّ المؤقت الثاني لم يُنشَأ حتى انتهى تنفيذ الأول. لكن في الدالة الثانية فقد أُنشِئ كلا المؤقتين معًا وثم انتظرناهما (await
) معًا؛ وهذا أدى إلى تنفيذ الدالة في ثانيتين بدلًا من 4 ثواني، وذلك لأنَّ المؤقتين يعملان في وقتٍ واحد؛ لكن لاحظ أنَّ استدعائَيّ await
سيعملان بالتسلسل وليس بالتوازي: أي أنَّ هذا ليس تطبيقًا تلقائيًا لاستخدام Promise.all
، فإذا أردتَ انتظار await
وعدَين (promises) أو أكثر على التوازي، فيجب أن تستخدم Promise.all
.
دعم المتصفحات
الميزة | Chrome | Firefox | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
الدعم الأساسي | 55 | 52 | غير مدعومة | 42 | 10.1 |
على النقيض من متصفح IE، يدعم متصفح Edge هذه الميزة.
مصادر ومواصفات
- مسودة المعيار ECMAScript Latest Draft.
- معيار ECMAScript 2017.