الوعود (Promises)¶
الأساسيات¶
التمرين 1: تأمّل الشيفرة التالية.
let x = 100
if (x=== 100){
console.log("ok")
}else{
console.log("bad")
}
النتيجة هي: ok
ما الوعد (Promise)؟
الوعد في JavaScript كائن له حالة تتغيّر بحسب نتيجة العملية التي يمثّلها.
التمرين 2: تأمّل الشيفرة التالية.
let x = 100
let promise = new Promise(function(resolve, reject){
if (x=== 100){
resolve("ok")
}else{
reject("bad")
}
})
console.log(promise)
النتيجة هي:
Promise { "fulfilled" }
<state>: "fulfilled"
<value>: "ok"
الوعد المتحقق
تكون حالة الوعد «متحققًا» عندما تنجح العملية التي يمثّلها.
التمرين 3: تأمّل الشيفرة التالية.
let x = 4
let promise = new Promise(function(resolve, reject){
if (x=== 100){
resolve("ok")
}else{
reject("bad")
}
})
console.log(promise)
النتيجة هي:
Promise { "rejected" }
<state>: "rejected"
<reason>: "bad"
الوعد المرفوض
تكون حالة الوعد «مرفوضًا» عندما تكون العملية التي يمثّلها غير ناجحة.
التمرين 4: أنشئ دالة تُرجع الوعد الذي أنشأته في التمرين 3
function checkX(x){
return new Promise(function(resolve, reject){
if (x === 100){
resolve("ok")
}else{
reject("bad")
}
})
}
console.log(checkX(5))
النتيجة هي:
Promise { "rejected" }
<state>: "rejected"
<reason>: "bad"
التمرين 5: اجعل الوعد المُرجع من checkX يتحقق بعد ثانيتين.
function checkX(x) {
return new Promise(function (resolve, reject) {
if (x === 100) {
setTimeout(resolve, 2000, "ok");
} else {
setTimeout(reject, 2000, "bad");
}
});
}
let result = checkX(5);
console.log(result);
النتيجة هي:
Promise { "pending" }
<state>: "pending"
الوعد قيد الانتظار
تكون حالة الوعد «قيد الانتظار» ما دام لم يتحقق ولم يُرفض بعد.
التمرين 6: أنشئ دالة تستقبل name معاملًا، وتُرجع وعدًا متحققًا إذا كانت قيمة name تساوي Nawras؛ وإلا فتُرجع وعدًا مرفوضًا.
function checkName(name) {
return new Promise(function (resolve, reject) {
if (name === "Nawras") {
resolve("Name is correct")
} else {
reject("Name is NOT correct")
}
});
}
let result1 = checkName("Nawras");
let result2 = checkName("Ali");
console.log(result1);
console.log(result2);
النتيجة هي:
Promise { "fulfilled" }
<state>: "fulfilled"
<reason>: "Name is correct"
Promise { "rejected" }
<state>: "rejected"
<reason>: "Name is NOT correct"
التمرين 7: أنشئ دالة تستقبل a و b معاملين، وتُرجع وعدًا متحققًا إذا كانت قيمة a أكبر من b ؛ وإلا فتُرجع وعدًا مرفوضًا.
function compare(a, b) {
return new Promise(function (resolve, reject) {
if (a > b) {
resolve("a is greater than b")
} else {
reject("a is NOT greater than b")
}
});
}
let result1 = compare(6, -1)
let result2 = compare(6, 11)
console.log(result1);
console.log(result2);
النتيجة هي:
Promise { "fulfilled" }
<state>: "fulfilled"
<reason>: "a is greater than b"
Promise { "rejected" }
<state>: "rejected"
<reason>: "a is NOT greater than b"
promise.then()¶
promise.then(func)
إذا تحقق الوعد، فإن الدالة func تُستدعى.
التمرين 8: تأمّل الشيفرة التالية
function checkX(x){
return new Promise(function(resolve, reject){
if (x === 100){
resolve("ok")
}else{
reject("bad")
}
})
}
checkX(100).then(function(value){
console.log(value)
})
النتيجة هي:
ok
التمرين 9: استخرج قيمة الوعد في التمرين 6.
function checkName(name) {
return new Promise(function (resolve, reject) {
if (name === "Nawras") {
resolve("Name is correct")
} else {
reject("Name is NOT correct")
}
});
}
checkName("Nawras").then(function(value){
console.log(value)
})
النتيجة هي:
Name is correct
التمرين 10: استخرج قيمة الوعد في التمرين 7.
function compare(a, b) {
return new Promise(function (resolve, reject) {
if (a > b) {
resolve("a is greater than b")
} else {
reject("a is NOT greater than b")
}
});
}
compare(10, 5).then(function(value){
console.log(value);
})
النتيجة هي:
a is greater than b
promise.catch()¶
promise.catch(func)
إذا رُفض الوعد، فإن الدالة func تُستدعى.
التمرين 11: تأمّل الشيفرة التالية
function checkX(x){
return new Promise(function(resolve, reject){
if (x === 100){
resolve("ok")
}else{
reject("bad")
}
})
}
checkX(50).catch(function(error){
console.log(error)
})
النتيجة هي:
bad
التمرين 12: عالج رفض الوعد في التمرين 6.
function checkName(name) {
return new Promise(function (resolve, reject) {
if (name === "Nawras") {
resolve("Name is correct")
} else {
reject("Name is NOT correct")
}
});
}
checkName("Ali").catch(function(error){
console.log(error)
})
النتيجة هي:
Name is NOT correct
التمرين 13: عالج رفض الوعد في التمرين 7.
function compare(a, b) {
return new Promise(function (resolve, reject) {
if (a > b) {
resolve("a is greater than b")
} else {
reject("a is NOT greater than b")
}
});
}
compare(0, 5).catch(function(error){
console.log(error);
})
النتيجة هي:
a is NOT greater than b
تدريبات¶
التمرين 14: أنشئ دالة تُرجع وعدًا يتحقق إذا كانت القيمة المُمرّرة سلسلة نصية، ويُرفض في غير ذلك.
function isString(val) {
return new Promise((resolve, reject) => {
if (typeof val === "string") {
resolve(`yes, ${val} is a string`);
} else {
resolve(`no, ${val} is not a string`);
}
});
}
isString(5)
.then((val) => console.log(val))
.catch((err) => console.log(err));
isString("ali")
.then((val) => console.log(val))
.catch((err) => console.log(err));
النتيجة هي:
no, 5 is not a string
yes, ali is a string
التمرين 15: أنشئ دالة تُرجع وعدًا يتحقق ما دامت القيمة المُمرّرة لا تساوي صفرًا.
function isNotZero(val) {
return new Promise((resolve, reject) => {
if (val !== 0) {
resolve(`yes, ${val} is not equal to zero`);
} else {
reject(`no, ${val} is equal to zero`);
}
});
}
isNotZero(5)
.then((val) => console.log(val))
.catch((err) => console.log(err));
isNotZero(0)
.then((val) => console.log(val))
.catch((err) => console.log(err));
النتيجة هي:
yes, 5 is not equal to zero
no, 0 is equal to zero