JavaScript-ში შესრულებული პრომისების შექმნა
ზოგჯერ შეიძლება დაგჭირდეთ უკვე
შესრულებული პრომისის შექმნა. ამისთვის არსებობს
ორი მეთოდი: მეთოდი Promise.resolve
ქმნის წარმატებით შესრულებულ პრომისს, Promise.reject
ქმნის უარყოფილ პრომისს. პარამეტრად ეს
მეთოდები იღებენ იმას, რაც გახდება პრომისის
შედეგი ან შეცდომა შესაბამისად.
როდის შეიძლება დაგვჭირდეს უკვე შესრულებული პრომისი? მოდით შევხედოთ მაგალითს. დავუშვათ გვაქვს რაღაც ფუნქცია, რომელიც პარამეტრად იღებს რიცხვს, აკეთებს მასთან რაღაც ასინქრონულად და აბრუნებს პრომისს შედეგთან:
function func(num) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
}
ჩვენ ჩვენი ფუნქციით შემდეგნაირად ვიხმარებთ:
func(5).then(function(res) {
console.log(res); // გამოიტანს 25-ს
});
დავუშვათ ახლა გადავწყვიტეთ, რომ ჩვენი ასინქრონული ოპერაცია შევასრულებთ მხოლოდ მაშინ, თუ გადაეცემა ნულზე მეტი რიცხვი. წინააღმდეგ შემთხვევაში ფუნქციის შედეგი უნდა იყოს ნული:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return 0; // ნულოვანი შედეგი
}
}
თუმცა, ახლა გამოდის, რომ ფუნქცია აბრუნებს
ან პრომისს, ან რიცხვს. ამის გამო ჩვენ ვეღარ
შეგვიძლია გამოვიყენოთ მეთოდი then ფუნქციის
შედეგზე, რადგან იმ შემთხვევაში, როდესაც ფუნქცია
აბრუნებს რიცხვს, მივიღებთ შეცდომას:
func(0).then(function(res) { // შეცდომა, ვიყენებთ then მეთოდს ნულზე
});
პრობლემის გადასაჭრელად დაგვეხმარება Promise.resolve:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else {
return Promise.resolve(0); // ვაბრუნებთ პრომისს და არა რიცხვს
}
}
დავუშვათ ახლა გადავწყვიტეთ, რომ გადაცემული
ნულისთვის უნდა დავაბრუნოთ ნული, ხოლო ნულზე
ნაკლები რიცხვებისთვის - გამონაკლისი. ამაში დაგვეხმარება
მეთოდი Promise.reject:
function func(num) {
if (num > 0) {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(num * num);
}, 3000);
});
} else if (num === 0) {
return Promise.resolve(0);
} else {
return Promise.reject('incorrect number'); // დავაბრუნოთ უარყოფილი პრომისი
}
}