پرامیس ها (Promises)
«پرامیس (Promise)» قولِ نتیجه آینده است. کد تولیدکننده کار می کند و کد مصرف کننده منتظر نتیجه می ماند. مثل سفارش پیتزا؛ رستوران می پزد، تو بعداً تحویل می گیری.
شی پرامیس در جاوااسکریپت
پرامیس بین «کد تولیدکننده» و «کد مصرف کننده» پل می زند.
let myPromise = new Promise(function (myResolve, myReject) {
// Producing Code: ممکن است زمان بر باشد
myResolve();
myReject();
});
myPromise.then(
function (value) {
/* کد در صورت موفقیت */
},
function (error) {
/* کد در صورت خطا */
}
);
نکته: تولیدکننده در موفقیت resolve را صدا می زند و در خطا reject.
خواص و حالت های پرامیس
پرامیس سه حالت دارد: درحال انتظار، انجام شده، ردشده. نتیجه هم متناسب تغییر می کند.
نمونه کامل با then
در این مثال، نتیجه محاسبه نمایش داده می شود.
function myDisplayer(some) {
document.getElementById("demo").innerHTML = some;
}
let myPromise = new Promise(function (myResolve, myReject) {
let x = 0;
if (x == 0) {
myResolve("OK");
} else {
myReject("Error");
}
});
myPromise.then(
function (value) {
myDisplayer(value);
},
function (error) {
myDisplayer(error);
}
);
مقایسه کالبک و پرامیس: تاخیر زمانی
اول با کالبک و سپس همان کار با پرامیس انجام می شود.
کالبک
setTimeout(function () {
myFunction("I love You !!!");
}, 3000);
function myFunction(value) {
document.getElementById("demo").innerHTML = value;
}
پرامیس
let myPromise = new Promise(function (myResolve, myReject) {
setTimeout(function () {
myResolve("I love You !!");
}, 3000);
});
myPromise.then(function (value) {
document.getElementById("demo").innerHTML = value;
});
مقایسه کالبک و پرامیس: درخواست فایل
کالبک
function getFile(myCallback) {
let req = new XMLHttpRequest();
req.open('GET', "mycar.html");
req.onload = function () {
if (req.status == 200) {
myCallback(req.responseText);
} else {
myCallback("Error: " + req.status);
}
};
req.send();
}
getFile(myDisplayer);
پرامیس
let myPromise = new Promise(function (myResolve, myReject) {
let req = new XMLHttpRequest();
req.open('GET', "mycar.html");
req.onload = function () {
if (req.status == 200) {
myResolve(req.response);
} else {
myReject("File not Found");
}
};
req.send();
});
myPromise.then(
function (value) {
myDisplayer(value);
},
function (error) {
myDisplayer(error);
}
);
گام های عملی
- یک پرامیس بساز و
resolveرا صدا بزن. - خروجی را با
thenدر صفحه نمایش بده. - یک مسیر خطا بساز و
rejectرا تست کن.
برای زمینه غیرهمزمان به غیرهمزمان سر بزن. مسیر کلی را هم در کنترل جریان ببین. اگر با کالبک شروع کرده ای، صفحه کالبک ها کمک می کند.
جمع بندی سریع
- پرامیس قولِ نتیجه آینده است.
resolveبرای موفقیت،rejectبرای خطاست.thenموفقیت را مدیریت می کند.- خطاها را در دومین آرگومان
thenبگیر. - کد با پرامیس خواناتر از کالبک می شود.