تعابير تعريف الدوال غير المتزامنة في 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 هذه الميزة.

مصادر ومواصفات