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('туура эмес сан'); // четке кагылган промис кайтарабыз
}
}