Asinxron nəticə ilə işləmək
Sinxron JavaScript kodu cari icra axınında ardıcıllıqla işləyir. Taymer və şəbəkə işi gözlənərkən brauzer digər işləri görə bilər. Promise gələcək nəticənin təmsilidir: pending vəziyyətindən fulfilled və ya rejected vəziyyətinə keçir; bir dəfə tamamlandıqdan sonra vəziyyəti dəyişmir.
const delay = milliseconds => new Promise((resolve, reject) => {
if (!Number.isFinite(milliseconds) || milliseconds < 0) {
reject(new Error('Yanlış gecikmə'));
return;
}
setTimeout(resolve, milliseconds);
});
delay(1000).then(() => console.log('done')).catch(console.error);
async function run() {
try {
const values = await Promise.all([
delay(200).then(() => 'birinci'),
delay(50).then(() => 'ikinci')
]);
console.log(values); // ['birinci', 'ikinci']
} catch (error) { console.error(error.message); }
}
run();
Zəncir, taymer və səhvlər
then yeni Promise qaytarır; içindəki nəticəni növbəti addıma ötürmək üçün return et. Atılan xəta və rədd növbəti catch-ə keçir. async funksiya həmişə Promise qaytarır; await cari async funksiyanın davamını gözlədir, bütün brauzeri dayandırmır.
Promise.all nəticələri giriş sırası ilə verir. Biri rədd ediləndə ümumi nəticə rədd olur, digər işlər avtomatik dayanmır. setTimeout bir dəfə, setInterval təkrar planlayır; clearTimeout və clearInterval ilə təmizlə. Gecikmə dəqiq vaxt zəmanəti deyil. Sonsuz sinxron dövr isə event loop-un növbədəki işi emal etməsini əngəlləyə bilər.