პრომისები JavaScript-ში - შესავალი
თქვენ უკვე იცით, რომ ასინქრონულობის კოლბექების მოდელის გამოყენება მარტივად იწვევს callback hell-ის სიტუაციას. ამიტომ JavaScript-ში შემოვიდა ახალი მოდელი სახელად პრომისები (promise). მოდით შევისწავლოთ ეს მოდელი.
პრომისი წარმოადგენს ობიექტს, რომელშიც პარამეტრად გადაეცემა ფუნქცია, რომლის შიგნითაც უნდა განვათავსოთ ჩვენი ასინქრონული კოდი:
let promise = new Promise(function() {
// ასინქრონული კოდი
});
როგორც ხედავთ, მე ჩავწერე ობიექტი პრომისით
ცვლადში promise. კოდის სხვა ადგილას
შემიძლია გამოვიყენო ამ ცვლადზე
მეთოდი then, რომელსაც გადავცემ ფუნქციას
იმ კოდით, რომელიც უნდა შესრულდეს
ასინქრონული კოდის დასრულების შემდეგ, რომელიც
დაწერილია ამ პრომისის შექმნისას:
promise.then(function() {
// შესრულდება ასინქრონული კოდის დასრულებისას
});
ჟღერს გაუგებრად, ამიტომ მოდით შევხედოთ მაგალითს. დავუშვათ, მე მაქვს ასეთი ასინქრონული კოდი:
setTimeout(function() {
let result = [1, 2, 3, 4, 5];
}, 3000);
დავუშვათ, მე მინდა მისთვის გადავწყვიტო ჩვენი მთავარი
ასინქრონულობის ამოცანა: შევასრულოთ გარკვეული
კოდი ტაიმერის მოქმედების შემდეგ. ამ შემთხვევაში
მე არ მინდა ამ კოდის განთავსება თავად ტაიმერში
და მინდა, რომ ამ კოდში როგორმე მოხვდეს შედეგი,
რომელიც მე დავწერე ცვლადში result.
ზოგადად, ჩვენ გადავჭრით ეს ამოცანა წინა
გაკვეთილებში კოლბექების და გამოწერების მეშვეობით. მოდით
ახლა ვნახოთ, როგორ გავაკეთოთ ეს პრომისების მეშვეობით.
პირველ რიგში, საჭიროა ჩვენი ასინქრონული კოდის შეფუთვა პრომისში:
let promise = new Promise(function() {
setTimeout(function() {
let result = [1, 2, 3, 4, 5];
}, 3000);
});
ამით, თუმცა, საკმარისი არ არის. ჩვენ უნდა ცალსახად მივუთითოთ, რომ ჩვენი ასინქრონული კოდი დასრულდა. ამაში დაგვეხმარება სპეციალური დასრულების ფუნქცია, რომელიც ავტომატურად შედის პირლე პარამეტრში ფუნქციის, თუ ის მითითებულია:
let promise = new Promise(function(resolve) { // მივუთითებთ პარამეტრს
setTimeout(function() {
let result = [1, 2, 3, 4, 5];
}, 3000);
});
დასრულების ფუნქციის გამოყენებით ჩვენ შეგვიძლია ცალსახად მივუთითოთ პრომისს, რომ ასინქრონული კოდი დასრულდა. ამისთვის ჩვენ უნდა გამოვიძახოთ ეს ფუნქცია ჩვენთვის საჭირო ადგილას:
let promise = new Promise(function(resolve) {
setTimeout(function() {
let result = [1, 2, 3, 4, 5];
resolve(); // ვასრულებთ პრომისს
}, 3000);
});
ამ შემთხვევაში, თუ გვსურს გადავცეთ გარეთ რაიმე ასინქრონული კოდის შედეგი, ჩვენ შეგვიძლია გადავცეთ ის პარამეტრად ჩვენს დასრულების ფუნქციას:
let promise = new Promise(function(resolve) {
setTimeout(function() {
let result = [1, 2, 3, 4, 5];
resolve(result); // ვაწვდით შედეგს
}, 3000);
});
რა თქმა უნდა, შესაძლებელია შუალედური ცვლადის მოშორება:
let promise = new Promise(function(resolve) {
setTimeout(function() {
resolve([1, 2, 3, 4, 5]);
}, 3000);
});
ახლა ნებისმიერ სხვა ადგილას ჩვენ შეგვიძლია გამოვიძახოთ
მეთოდი then ჩვენი პრომისის:
promise.then(function() {
// იმოქმედებს პრომისის დასრულებისას
});
პრომისის მუშაობის შედეგი მოხვდება პირველ პარამეტრში ფუნქციის, თუ ჩვენ გვსურს მისი მითითება:
promise.then(function(result) {
console.log(result); // გამოიტანს მასივს შედეგით
});
შექმენით პრომისი, რომლის შიგნით იქნება დაყოვნება
5 წამის, რის შემდეგაც პრომისმა უნდა
შესრულდეს, თავისი შედეგით დააბრუნოს რაიმე
ტექსტი. გამოიტანეთ ეს ტექსტი ეკრანზე.