Ø³ÙØ§Ø³Ù اÙÙ promises رائعة ÙÙ Ù
Ø¹Ø§ÙØ¬Ø© Ø§ÙØ£Ø®Ø·Ø§Ø¡. Ø¹ÙØ¯Ù
ا ÙØ±Ùض اÙÙØ¹Ø¯ Ø ÙÙÙØ² Ø¹ÙØµØ± Ø§ÙØªØÙÙ
Ø¥ÙÙ Ø£ÙØ±Ø¨ Ù
Ø¹Ø§ÙØ¬ Ø±ÙØ¶. ÙØ°Ø§ Ù
Ø±ÙØ ÙÙØºØ§ÙØ© Ù٠اÙÙ
Ù
ارسة.
عÙ٠سبÙ٠اÙÙ
Ø«Ø§Ù Ø ÙÙ Ø§ÙØªØ¹ÙÙÙ
ات Ø§ÙØ¨Ø±Ù
Ø¬ÙØ© أسÙ٠عÙÙØ§Ù URL ÙÙ Ø¬ÙØ¨ 'ØºÙØ± صØÙØ (ÙØ§ ÙÙØ¬Ø¯ Ù
Ø«Ù ÙØ°Ø§ اÙÙ
ÙÙØ¹) ÙÙØªØ¹Ø§Ù
Ù .atchâ Ù
ع Ø§ÙØ®Ø·Ø£:
fetch('https://no-such-server.blabla') // rejects
.then(response => response.json())
.catch(err => alert(err)) // TypeError: failed to fetch (the text may vary)
Ù٠ا ØªØ±Ù Ø ÙØ§ ÙØ¬Ø¨ Ø£Ù ÙÙÙÙ âØ§ÙØµÙدâ ÙÙØ±ÙÙØ§. ÙØ¯ ØªØ¸ÙØ± بعد ÙØ§ØØ¯ أ٠رب٠ا عدة âØ«Ù â.
Ø£Ù Ø Ø±Ø¨Ù Ø§ Ø ÙÙ Ø´ÙØ¡ عÙ٠٠ا ÙØ±Ø§Ù ٠ع اÙÙ ÙÙØ¹ Ø ÙÙÙÙ Ø§ÙØ¥Ø¬Ø§Ø¨Ø© ØºÙØ± ØµØ§ÙØØ© ÙÙ JSON. أسÙ٠طرÙÙØ© ÙÙÙØ¨Ø¶ عÙÙ Ø¬Ù ÙØ¹ Ø§ÙØ£Ø®Ø·Ø§Ø¡ ÙÙ Ø¥ÙØØ§Ù â.catchâ Ø¨ÙÙØ§ÙØ© Ø§ÙØ³ÙØ³ÙØ©:
fetch('/article/promise-chaining/user.json')
.then(response => response.json())
.then(user => fetch(`https://api.github.com/users/${user.name}`))
.then(response => response.json())
.then(githubUser => new Promise((resolve, reject) => {
let img = document.createElement('img');
img.src = githubUser.avatar_url;
img.className = "promise-avatar-example";
document.body.append(img);
setTimeout(() => {
img.remove();
resolve(githubUser);
}, 3000);
}))
.catch(error => alert(error.message));
Ø¹Ø§Ø¯Ø©Ù Ø ÙØ§ ÙØªÙ تشغÙÙ â.catchâ Ø¹ÙÙ Ø§ÙØ¥Ø·ÙاÙ. ÙÙÙ٠إذا Ø±ÙØ¶ أ٠٠٠اÙÙØ¹Ùد Ø£Ø¹ÙØ§Ù (Ù Ø´ÙÙØ© ÙÙ Ø§ÙØ´Ø¨ÙØ© Ø£Ù json ØºÙØ± ØµØ§ÙØ Ø£Ù Ø£ÙØ§ ÙØ§Ù) Ø ÙØ³ÙÙ ÙÙØªÙØ·ÙØ§.
Implicit tryâ¦catch
ر٠ز تÙÙÙØ° اÙÙØ¹Ø¯ ÙÙ Ø¹Ø§ÙØ¬Ù اÙÙØ¹Ø¯ ÙØØªÙ٠عÙÙ âÙ ØØ§ÙÙØ© ØºÙØ± Ù Ø±Ø¦ÙØ©â ØºÙØ± Ù Ø±Ø¦ÙØ© ØÙÙÙ. إذا ØØ¯Ø« Ø§Ø³ØªØ«ÙØ§Ø¡ Ø ÙØªÙ اÙÙØ¨Ø¶ عÙÙÙ ÙÙ Ø¹Ø§Ù ÙØªÙ عÙ٠أÙÙ Ø±ÙØ¶.
عÙ٠سبÙ٠اÙÙ Ø«Ø§Ù Ø ÙØ°Ø§ اÙÙÙØ¯:
new Promise((resolve, reject) => {
throw new Error("Whoops!");
}).catch(alert); // Error: Whoops!
â¦ ÙØ¹Ù Ù ØªÙ Ø§Ù ÙØ§ Ù Ø«Ù ÙØ°Ø§:
new Promise((resolve, reject) => {
reject(new Error("Whoops!"));
}).catch(alert); // Error: Whoops!
اÙÙ try..catch ØºÙØ± اÙÙ
Ø±Ø¦ÙØ© ØÙ٠اÙÙ
ÙÙØ° تÙÙÙ
Ø¨Ø§ÙØªÙاط Ø§ÙØØ·Ø£ بشÙÙ Ø£ÙØªÙÙ
اتÙÙÙ ÙÙØÙÙ٠إÙÙ rejected promise.
ÙØØ¯Ø« ÙØ°Ø§ ÙÙØ³ ÙÙØ· ÙÙ ÙØ¸ÙÙØ© اÙÙ ÙÙØ° Ø ÙÙÙÙ ÙÙ Ù Ø¹Ø§ÙØ¬Ø§ØªÙا Ø£ÙØ¶Ùا. إذا ÙÙ ÙØ§ âØ¨Ø¥ÙÙØ§Ø¡â Ø¯Ø§Ø®Ù Ù Ø¹Ø§ÙØ¬ â.thenâ Ø ÙÙØ°Ø§ ÙØ¹ÙÙ ÙØ¹Ø¯Ùا ٠رÙÙØ¶Ùا Ø ÙØ°ÙÙ ÙÙØªÙÙ Ø¹ÙØµØ± Ø§ÙØªØÙ٠إÙÙ Ø£ÙØ±Ø¨ Ù Ø¹Ø§ÙØ¬ أخطاء.
Ø¥ÙÙ٠٠ثاÙ:
new Promise((resolve, reject) => {
resolve("ok");
}).then((result) => {
throw new Error("Whoops!"); // rejects the promise
}).catch(alert); // Error: Whoops!
ÙØØ¯Ø« ÙØ°Ø§ ÙØ¬Ù
ÙØ¹ Ø§ÙØ£Ø®Ø·Ø§Ø¡ Ø ÙÙÙØ³ ÙÙØ· تÙÙ Ø§ÙØªÙ ØªØ³Ø¨Ø¨ÙØ§ عبارة throw. عÙ٠سبÙ٠اÙÙ
Ø«Ø§Ù Ø Ø®Ø·Ø£ ÙÙ Ø§ÙØ¨Ø±Ù
جة:
new Promise((resolve, reject) => {
resolve("ok");
}).then((result) => {
blabla(); // no such function
}).catch(alert); // ReferenceError: blabla is not defined
ÙØ§ ÙÙØªÙÙ âcatchâ Ø§ÙÙÙØ§Ø¦Ù Ø¨Ø±ÙØ¶ ØµØ±ÙØ ÙØØ³Ø¨ Ø Ø¨Ù ÙØ´ØªÙ Ù Ø£ÙØ¶Ùا عÙ٠أخطاء Ø¹Ø±Ø¶ÙØ© Ù٠اÙÙ Ø¹Ø§ÙØ¬Ø§Øª Ø£Ø¹ÙØ§Ù.
إعادة Ø±Ù Ù Ø§ÙØ®Ø·Ø£
Ù٠ا ÙØ§ØØ¸Ùا باÙÙØ¹Ù Ø â.catchâ ÙÙ ÙÙØ§ÙØ© Ø§ÙØ³ÙØ³ÙØ© ÙØ´Ø¨Ù âtryâ¦catchâ. ÙØ¯ ÙÙÙÙ ÙØ¯ÙÙØ§ Ø§ÙØ¹Ø¯Ø¯ Ø§ÙØ°Ù ØªØ±ÙØ¯Ù Ù Ù Ù Ø¹Ø§ÙØ¬Ø§Øª âthen`â Ø Ø«Ù ÙØ³ØªØ®Ø¯Ù â.catchâ ÙØ§ØØ¯Ùا Ù٠اÙÙÙØ§ÙØ© ÙÙØªØ¹Ø§Ù ٠٠ع Ø§ÙØ£Ø®Ø·Ø§Ø¡ ÙÙ Ø¬Ù ÙØ¹Ùا.
ÙÙ âØ§ÙÙ ØØ§ÙÙØ© ⦠اÙÙ ØµÙØ¯â Ø§ÙØ¹Ø§Ø¯ÙØ© Ø ÙÙ ÙÙÙØ§ تØÙÙÙ Ø§ÙØ®Ø·Ø£ ÙØ±Ø¨Ù ا إعادة تر٠Ù٠٠إذا ÙÙ ÙÙ٠٠٠اÙÙ Ù ÙÙ Ù Ø¹Ø§ÙØ¬ØªÙ. ÙÙØ³ Ø§ÙØ´ÙØ¡ Ù Ù ÙÙ ÙÙÙØ¹Ùد.
إذا ÙÙ
ÙØ§ بإÙÙØ§Ø¡ داخÙ.catch Ø ÙØ³ÙÙØªÙÙ Ø¹ÙØµØ± Ø§ÙØªØÙÙ
Ø¥ÙÙ Ø£ÙØ±Ø¨ Ù
Ø¹Ø§ÙØ¬ أخطاء Ø§ÙØªØ§ÙÙ. ÙØ¥Ø°Ø§ تعاÙ
ÙÙØ§ Ù
ع Ø§ÙØ®Ø·Ø£ ÙØ§ÙتÙÙÙØ§ بشÙÙ Ø·Ø¨ÙØ¹Ù Ø ÙØ³ÙستÙ
ر Ø¥ÙÙ Ø£ÙØ±Ø¨ Ù
Ø¹Ø§ÙØ¬ .then Ø§ÙØªØ§ÙÙ.
Ù٠اÙÙ
Ø«Ø§Ù Ø£Ø¯ÙØ§Ù ÙØªØ¹Ø§Ù
Ù catch Ø¨ÙØ¬Ø§Ø Ù
ع Ø§ÙØ®Ø·Ø£:
// the execution: catch -> then
new Promise((resolve, reject) => {
throw new Error("Whoops!");
}).catch(function(error) {
alert("The error is handled, continue normally");
}).then(() => alert("Next successful handler runs"));
ÙÙØ§ ØªÙØªÙÙ ÙØªÙØ© âØ§ÙØµÙØ¯â Ø¨Ø´ÙÙ Ø·Ø¨ÙØ¹Ù. ÙØ°ÙÙ ÙØªÙ استدعاء Ù Ø¹Ø§ÙØ¬ â.thenâ Ø§ÙÙØ§Ø¬Ø Ø§ÙØªØ§ÙÙ.
Ù٠اÙÙ
Ø«Ø§Ù Ø£Ø¯ÙØ§Ù ÙØ±Ù اÙÙ
ÙÙÙ Ø§ÙØ¢Ø®Ø± Ù
ع â.catchâ. Ù
Ø¹Ø§ÙØ¬ (*) ÙÙ
Ø³Ù Ø§ÙØ®Ø·Ø£ ÙÙØ§ ÙÙ
ÙÙÙ Ø§ÙØªØ¹Ø§Ù
Ù Ù
ع٠(عÙ٠سبÙ٠اÙÙ
Ø«Ø§Ù Ø ÙÙÙ ÙØ¹Ø±Ù ÙÙØ· ÙÙÙÙØ© Ø§ÙØªØ¹Ø§Ù
Ù Ù
ع URIError) Ø ÙØ°Ø§ ÙØ¥ÙÙ ÙØ±Ù
ÙÙ Ù
رة أخرÙ:
// the execution: catch -> catch
new Promise((resolve, reject) => {
throw new Error("Whoops!");
}).catch(function(error) { // (*)
if (error instanceof URIError) {
// handle it
} else {
alert("Can't handle such error");
throw error; // throwing this or another error jumps to the next catch
}
}).then(function() {
/* doesn't run here */
}).catch(error => { // (**)
alert(`The unknown error has occurred: ${error}`);
// don't return anything => execution goes the normal way
});
ÙÙÙØ² Ø§ÙØªÙÙÙØ° Ù
٠أÙÙ â.catchâ (*) Ø¥ÙÙ Ø§ÙØªØ§ÙÙ (**) أسÙÙ Ø§ÙØ³ÙØ³ÙØ©.
ØØ§Ùات Ø§ÙØ±Ùض Ø§ÙØªÙ ÙÙ ØªØªÙ Ù Ø¹Ø§ÙØ¬ØªÙا
٠اذا ÙØØ¯Ø« Ø¹ÙØ¯Ù ا ÙØ§ ÙØªÙ Ù Ø¹Ø§ÙØ¬Ø© Ø§ÙØ®Ø·Ø£Ø عÙ٠سبÙ٠اÙÙ Ø«Ø§Ù Ø ÙØ³ÙÙØ§ Ø¥ÙØØ§Ù âØ§ÙØµÙØ¯â Ø¨ÙÙØ§ÙØ© Ø§ÙØ³ÙØ³ÙØ© Ø Ù٠ا ÙÙÙ:
new Promise(function() {
noSuchFunction(); // Error here (no such function)
})
.then(() => {
// successful promise handlers, one or more
}); // without .catch at the end!
IÙÙ ØØ§ÙØ© ÙØ¬Ùد خطأ Ø ÙØµØ¨Ø اÙÙØ¹Ø¯ ٠رÙÙØ¶Ùا Ø ÙÙØ¬Ø¨ Ø£Ù ÙÙÙØ² Ø§ÙØªÙÙÙØ° Ø¥ÙÙ Ø£ÙØ±Ø¨ Ù Ø¹Ø§ÙØ¬ Ø±ÙØ¶. ÙÙÙÙ ÙØ§ ÙÙØ¬Ø¯ Ø´ÙØ¡. ÙØ°ÙÙ âØ¹Ø§ÙÙâ Ø§Ùخطأ. ÙØ§ ÙÙØ¬Ø¯ ر٠ز ÙÙØªØ¹Ø§Ù Ù Ù Ø¹ÙØ§.
٠٠اÙÙØ§ØÙØ© Ø§ÙØ¹Ù ÙÙØ© Ø ØªÙ Ø§Ù ÙØ§ Ù٠ا ÙÙ Ø§ÙØØ§Ù Ù Ø¹ Ø§ÙØ£Ø®Ø·Ø§Ø¡ Ø§ÙØ¹Ø§Ø¯ÙØ© Ø§ÙØªÙ ÙÙ ØªØªÙ Ù Ø¹Ø§ÙØ¬ØªÙا ÙÙ Ø§ÙØªØ¹ÙÙ٠ات Ø§ÙØ¨Ø±Ù Ø¬ÙØ© Ø ÙÙØ°Ø§ ÙØ¹ÙÙ Ø£Ù Ø´ÙØ¦Ùا ٠ا ÙØ¯ ØØ¯Ø« خطأ ÙØ§Ø¯ØÙا.
٠اذا ÙØØ¯Ø« Ø¹ÙØ¯ ØØ¯ÙØ« خطأ عاد٠ÙÙØ§ ÙØªÙ Ø§ÙØªØ´Ø§ÙÙ Ø¨ÙØ§Ø³Ø·Ø© âtryâ¦catchâØ ÙÙ ÙØª Ø§ÙØ¨Ø±Ùا٠ج اÙÙØµÙ ٠ع Ø±Ø³Ø§ÙØ© ÙÙ ÙØØ¯Ø© Ø§ÙØªØÙÙ . ÙØØ¯Ø« Ø´ÙØ¡ ٠٠اث٠٠ع Ø±ÙØ¶ اÙÙØ¹Ø¯ ØºÙØ± اÙÙ Ø¹Ø§ÙØ¬.
ÙØªØªØ¨Ø¹ Ù ØØ±Ù Ø¬Ø§ÙØ§ Ø³ÙØ±Ùبت ØØ§Ùات Ø§ÙØ±Ùض ÙØ°Ù ÙÙÙÙØ¯ Ø®Ø·Ø£Ù Ø¹Ø§Ù ÙØ§ ÙÙ ÙØ°Ù Ø§ÙØØ§ÙØ©. ÙÙ ÙÙÙ Ø±Ø¤ÙØªÙ ÙÙ ÙØØ¯Ø© Ø§ÙØªØÙ٠إذا Ù٠ت بتشغÙ٠اÙÙ Ø«Ø§Ù Ø£Ø¹ÙØ§Ù.
Ù٠اÙÙ
ØªØµÙØ ÙÙ
ÙÙÙØ§ Ø§ÙØªØ´Ø§Ù Ù
Ø«Ù ÙØ°Ù Ø§ÙØ£Ø®Ø·Ø§Ø¡ باستخداÙ
Ø§ÙØØ¯Ø« unhandledrejection:
window.addEventListener('unhandledrejection', function(event) {
// the event object has two special properties:
alert(event.promise); // [object Promise] - the promise that generated the error
alert(event.reason); // Error: Whoops! - the unhandled error object
});
new Promise(function() {
throw new Error("Whoops!");
}); // no catch to handle the error
Ø§ÙØØ¯Ø« Ù٠جزء Ù Ù [Ù Ø¹ÙØ§Ø± HTML] (https://html.spec.whatwg.org/multipage/webappapis.html#unhandled-promise-rejections).
إذا ØØ¯Ø« خطأ Ø ÙÙÙ ÙÙÙ ÙÙØ§Ù âØ§ÙØªÙØ§Ø·â Ø ÙØ³Ùت٠تشغÙÙ Ù Ø¹Ø§ÙØ¬ âunhandledrejectionâ Ø ÙÙØØµÙ Ø¹ÙÙ ÙØ§Ø¦Ù âØ§ÙØØ¯Ø«â ٠ع ٠عÙÙ٠ات ØÙÙ Ø§ÙØ®Ø·Ø£ Ø ØØªÙ ÙØªÙ Ù٠٠٠اÙÙÙØ§Ù Ø¨Ø´ÙØ¡ ٠ا.
عادة ٠ا تÙÙÙ Ù Ø«Ù ÙØ°Ù Ø§ÙØ£Ø®Ø·Ø§Ø¡ ØºÙØ± ÙØ§Ø¨ÙØ© ÙÙØ§Ø³ØªØ±Ø¯Ø§Ø¯ Ø ÙØ°ÙÙ Ø£ÙØ¶Ù طرÙÙØ© ÙÙØ®Ø±Ùج ÙÙ Ø¥Ø¨ÙØ§Øº اÙ٠ستخد٠باÙÙ Ø´ÙÙØ© ÙØ±Ø¨Ù ا Ø§ÙØ¥Ø¨Ùاغ Ø¹Ù Ø§ÙØØ§Ø¯Ø« Ø¥ÙÙ Ø§ÙØ®Ø§Ø¯Ù .
ÙÙ Ø§ÙØ¨Ùئات ØºÙØ± اÙ٠ستعرضة ٠ث٠Node.js Ø ÙÙØ§Ù Ø·Ø±Ù Ø£Ø®Ø±Ù ÙØªØªØ¨Ø¹ Ø§ÙØ£Ø®Ø·Ø§Ø¡ Ø§ÙØªÙ ÙÙ ØªØªÙ Ù Ø¹Ø§ÙØ¬ØªÙا.
Ù ÙØ®Øµ
- ÙØ¹Ø§Ùج
.catchØ§ÙØ£Ø®Ø·Ø§Ø¡ Ù٠اÙÙØ¹Ùد Ø¨Ø¬Ù ÙØ¹ Ø£ÙÙØ§Ø¹Ùا: Ø³ÙØ§Ø¡ ÙØ§Ù Ø§Ø³ØªØ¯Ø¹Ø§Ø¡Ø±ÙØ¶ ()` أ٠خطأ ت٠طرØÙ ÙÙ Ù Ø¹Ø§ÙØ¬. - ÙØ¬Ø¨ ÙØ¶Ø¹ â.catchâ Ø¨Ø§Ùضبط ÙÙ Ø§ÙØ£Ù اÙÙ Ø§ÙØªÙ ÙØ±ØºØ¨ ÙÙ Ù Ø¹Ø§ÙØ¬Ø© Ø§ÙØ£Ø®Ø·Ø§Ø¡ ÙÙÙØ§ ÙÙ Ø¹Ø±ÙØ© ÙÙÙÙØ© Ø§ÙØªØ¹Ø§Ù Ù Ù Ø¹ÙØ§. ÙØ¬Ø¨ Ø£Ù ÙÙÙ٠اÙÙ Ø¹Ø§ÙØ¬ بتØÙÙÙ Ø§ÙØ£Ø®Ø·Ø§Ø¡ (تساعد ÙØ¦Ø§Øª Ø§ÙØ£Ø®Ø·Ø§Ø¡ اÙ٠خصصة) ÙØ¥Ø¹Ø§Ø¯Ø© Ø¥ÙØ´Ø§Ø¡ Ø§ÙØ£Ø®Ø·Ø§Ø¡ ØºÙØ± اÙ٠عرÙÙØ© (رب٠ا تÙÙ٠أخطاء بر٠جة).
- ÙØ§ بأس Ø¨Ø¹Ø¯Ù Ø§Ø³ØªØ®Ø¯Ø§Ù âØ§ÙØµÙØ¯â Ø¹ÙÙ Ø§ÙØ¥Ø·ÙØ§Ù Ø Ø¥Ø°Ø§ Ù٠تÙÙ ÙÙØ§Ù طرÙÙØ© ÙÙØªØ¹Ø§Ù٠٠٠خطأ.
- عÙÙ Ø£Ù ØØ§Ù Ø ÙØ¬Ø¨ Ø£Ù ÙÙÙÙ ÙØ¯ÙÙØ§ Ù
Ø¹Ø§ÙØ¬ Ø§ÙØ£ØØ¯Ø§Ø«
unhandledrejection(ÙÙÙ ØªØµÙØØ§Øª ÙØ§ÙÙØ¸Ùر ÙÙØ¨Ùئات Ø§ÙØ£Ø®Ø±Ù) ÙØªØªØ¨Ø¹ Ø§ÙØ£Ø®Ø·Ø§Ø¡ Ø§ÙØªÙ ÙÙ ØªØªÙ Ù Ø¹Ø§ÙØ¬ØªÙا ÙØ¥Ø¨Ùاغ اÙ٠ستخد٠(ÙØ±Ø¨Ù ا Ø®Ø§Ø¯Ù ÙØ§) بشأÙÙØ§ Ø ØØªÙ ÙØ§ ÙÙ ÙØª تطبÙÙÙØ§ Ø£Ø¨Ø¯ÙØ§.
Ø§ÙØªØ¹ÙÙÙØ§Øª
<code>Ø ÙÙÙÙØ«Ùر Ù Ù Ø§ÙØ³Ø·Ùر استخدÙ<pre>Ø ÙÙØ£Ùثر Ù Ù 10 Ø³Ø·ÙØ± استخد٠(plnkr, JSBin, codepenâ¦)