طرØÙØ§ÙØ§ Ù٠اÙÙØµÙ â[Ù ÙØ¯Ù Ø© Ø¥ÙÙ Ø±Ø¯ÙØ¯ اÙÙØ¯Ø§Ø¡ callbacks](https://academy.hsoub.com/programming/javascript/%D9%85%D9%82%D8%AF %D9%85%D8%A9-%D8%A5%D9%84%D9%89-%D8%B1%D8%AF%D9%88%D8%AF- %D8%A7%D9%84%D9%86%D8%AF%D8%A7%D8%A1-callbacks-%D9%81%D9%8A- %D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA- r914/)â Ù Ø´ÙÙØ©Ù Ø£ÙØ§ ÙÙ٠أÙÙ ÙØ¯ÙÙØ§ ØªØ³ÙØ³ÙÙØ§ ٠٠اÙÙ ÙØ§Ù ØºÙØ± اÙÙ ØªØ²Ø§Ù ÙØ© ÙÙØ¬Ø¨ Ø£Ù ØªÙØ¬Ø±Ù ÙØ§ØØ¯Ø©Ù بعد Ø§ÙØ£Ø®Ø±ÙØ Ù Ø«ÙÙØ§ تØÙ ÙÙ Ø§ÙØ³Ùربتات. ÙÙÙ ÙÙØªØ¨ Ø´ÙÙØ±Ø© ⦠ÙÙØ°Ù اÙÙ Ø´ÙÙØ©Ø ØªÙØ¯ÙÙ ÙÙØ§ اÙÙØ¹Ùد طرائ٠٠ختÙÙØ© ÙÙØ°Ø§ Ø§ÙØºØ±Ø¶. ÙÙÙ ÙØ°Ø§ اÙÙØµÙ Ø³ÙØªÙÙÙ٠ع٠سÙÙØ³ÙØ© اÙÙØ¹Ùد ÙÙØ·. ÙÙØ°Ø§ تÙÙÙ:
new Promise(function(resolve, reject) {
setTimeout(() => resolve(1), 1000); // (*)
}).then(function(result) { // (**)
alert(result); // 1
return result * 2;
}).then(function(result) { // (***)
alert(result); // 2
return result * 2;
}).then(function(result) {
alert(result); // 4
return result * 2;
});
اÙÙÙØ±Ø© ÙÙ
ا ÙÙÙØ§ Ù٠تÙ
Ø±ÙØ± اÙÙØ§ØªØ¬ ÙÙ Ø³ÙØ³ÙØ© ØªÙØ§Ø¨Ùع â.then ØªØ§Ø¨Ø¹ÙØ§ ØªØ§Ø¨Ø¹ÙØ§.
ÙÙØ°Ø§ تÙÙÙ:
- ÙØ¨Ø¯Ø£ اÙÙØ¹Ø¯ Ø§ÙØ£ÙÙÙ ÙÙÙÙØ¬Ø² Ø®ÙØ§Ù ثاÙÙØ© ÙØ§ØØ¯Ø© (*).
- Ø¨Ø¹Ø¯ÙØ§ ÙÙØ³ØªØ¯Ø¹Ù Ù
Ø¹Ø§ÙØ¬
â.then(**). - اÙÙØªÙجة Ø§ÙØªÙ Ø³ØªØ¹ÙØ¯ ستÙ
رر Ø¥ÙÙ Ù
Ø¹Ø§ÙØ¬
â.thenØ§ÙØªØ§ÙÙ(***). - ÙÙÙØ°Ø§â¦ .
ÙØ¸Ø±Ùا ÙØªÙ
Ø±ÙØ± اÙÙØªÙجة عÙÙ Ø·ÙÙ Ø³ÙØ³ÙØ© اÙÙ
Ø¹Ø§ÙØ¬Ø§ØªØ ÙÙ
ÙÙÙØ§ Ø±Ø¤ÙØ© Ø³ÙØ³ÙØ© Ù
٠استدعاءات
alertÙÙØ°Ø§: 1 â 2 â 4.
[promise-then-chain.png]
ÙÙØ¹Ùد سبب ÙØ°Ø§ ÙÙÙ٠إÙ٠أÙ٠استدعاء promise.then ÙÙØ¹Ùد ÙØ¹Ø¯Ùا ÙÙ Ø§ÙØ¢Ø®Ø±Ø بذÙÙ ÙÙ
ÙÙÙØ§ استدعاء Ø§ÙØªØ§Ø¨Ùع â.then Ø§ÙØªØ§Ù٠عÙÙ
ذÙ٠اÙÙØ¹Ø¯Ø ÙÙÙØ°Ø§.
ØÙÙ ØªÙØ¹Ùد Ø¯Ø§ÙØ© اÙÙ
ÙØ¹Ø§Ù
ÙØ© ÙÙÙ
ة٠Ù
Ø§Ø ØªØµÙØ± اÙÙÙÙ
Ø© ÙØ§ØªØ¬ ذÙ٠اÙÙØ¹Ø¯Ø بذÙÙ ÙÙ
Ù٠استدعاء â.then عÙÙÙ.
خطأ شائع بÙ٠اÙÙ
بتدئÙÙ: تÙÙÙÙØ§ ÙÙ
ÙÙÙØ§ Ø¥Ø¶Ø§ÙØ© Ø£ÙØ«Ø± Ù
Ù ØªØ§Ø¨ÙØ¹ â.then Ø¥ÙÙ ÙØ¹Ø¯ ÙØ§ØØ¯. ÙØ§ ÙÙØ¹Ø¯Ù ÙØ°Ø§ سÙÙØ³ÙØ© ÙØ¹Ùد.
Ù
Ø«ÙÙØ§:
let promise = new Promise(function(resolve, reject) {
setTimeout(() => resolve(1), 1000);
});
promise.then(function(result) {
alert(result); // 1
return result * 2;
});
promise.then(function(result) {
alert(result); // 1
return result * 2;
});
promise.then(function(result) {
alert(result); // 1
return result * 2;
});
ÙÙØ§ ÙØªØ¨Ùا Ø£ÙØ«Ø± Ù
Ù Ø¯Ø§ÙØ© Ù
ÙØ¹Ø§Ù
ÙØ© ÙÙØ¹Ø¯ ÙØ§ØØ¯Ø ÙÙØ°Ù Ø§ÙØªÙØ§Ø¨ÙØ¹ ÙØ§ تÙ
Ø±ÙØ± اÙÙÙÙ
Ø© Ø¥ÙÙ Ø¨Ø¹Ø¶ÙØ§ Ø§ÙØ¨Ø¹Ø¶Ø ب٠ÙÙÙ ØªØ¹Ø§ÙØ¬Ùا عÙÙ ØØ¯Ø©.
Ø¥ÙÙÙ Ø§ÙØµÙرة (ÙÙØ§Ø²Ù٠بÙÙÙØ§ ÙØ¨ÙÙ Ø§ÙØ³ÙØ³ÙØ© Ø£Ø¹ÙØ§Ù):
[promise-then-many.png]
تتÙÙÙÙ ÙÙÙ ØªÙØ§Ø¨Ùع â.then ÙÙ ÙÙØ³ اÙÙØ¹Ø¯ ذات اÙÙØ§ØªØ¬ (Ø£Ù ÙØ§ØªØ¬ اÙÙØ¹Ø¯) بذÙ٠تعرض Ø§ÙØ´ÙÙØ±Ø© Ø£Ø¹ÙØ§Ù ÙØªØ§Ø¦Ø¬ alert Ù
ØªØ·Ø§Ø¨ÙØ©: 1.
Ø£Ù
ÙØ§ عÙ
ÙÙÙØ§ ÙÙØ§Ø¯Ø±Ùا Ù
ا ÙØ³ØªØ¹Ù
Ù Ø£ÙØ«Ø± Ù
Ù Ø¯Ø§ÙØ© Ù
ÙØ¹Ø§Ù
ÙØ© ÙØ§ØØ¯Ø© ÙÙÙÙ ÙØ¹Ø¯Ø عÙÙ Ø¹ÙØ³ Ø§ÙØ³ÙÙØ³ÙØ© Ø§ÙØªÙ ÙØ´Ùع استعÙ
اÙÙØ§.
إعادة اÙÙØ¹Ùد
ÙÙ
ÙÙ ÙØ¯Ø§ÙØ© اÙÙ
ÙØ¹Ø§Ù
ÙØ© (اÙÙ
ستعÙ
ÙØ© ÙÙ â.then(handler)â) Ø¥ÙØ´Ø§Ø¡ ÙØ¹Ø¯ ÙØ¥Ø¹Ø§Ø¯ØªÙ.
ÙÙØ§ ØªÙØªØ¸Ø± Ø¯ÙØ§Ù اÙÙ
ÙØ¹Ø§Ù
ÙØ© Ø§ÙØ£Ø®Ø±Ù ØØªÙÙ ÙÙØªÙ
٠اÙÙØ¹Ø¯ ÙØªØ³ØªÙÙ
ÙØ§ØªØ¬Ù.
Ù
ثا٠عÙÙ ÙØ°Ø§:
new Promise(function(resolve, reject) {
setTimeout(() => resolve(1), 1000);
}).then(function(result) {
alert(result); // 1
// ÙØ§ØÙظ
return new Promise((resolve, reject) => { // (*)
setTimeout(() => resolve(result * 2), 1000);
});
}).then(function(result) { // (**)
alert(result); // 2
return new Promise((resolve, reject) => {
setTimeout(() => resolve(result * 2), 1000);
});
}).then(function(result) {
alert(result); // 4
});
ÙÙØ§ ÙØ¹Ø±Ø¶ Ø£ÙÙÙ ØªØ§Ø¨ÙØ¹ .then اÙÙÙÙ
Ø© 1 ÙÙÙØ¹Ùد new Promise(â¦)â ÙÙ Ø§ÙØ³Ø·Ø± (*). بعد ثاÙÙØ© ÙØ§ØØ¯Ø©Ø ⦠اÙÙØ¹Ø¯ ÙÙÙÙ
Ø±ÙØ±
ÙØ§ØªØ¬Ù (Ø£Ù ÙØ³ÙØ· Ø§ÙØªØ§Ø¨Ùع resolveØ ÙÙ ØØ§ÙØªÙØ§ ÙÙ result * 2) Ø¥ÙÙ Ø¯Ø§ÙØ© اÙÙ
ÙØ¹Ø§Ù
ÙØ© Ø§ÙØªØ§ÙÙØ© ÙÙ ØªØ§Ø¨ÙØ¹ .then Ø§ÙØªØ§ÙÙ. ÙØ±Ù ÙÙ٠أÙÙ
Ø§ÙØ¯Ø§ÙØ© ÙÙ Ø§ÙØ³Ø·Ø± (**) تعرض 2 ÙØªØ¤Ø¯ÙÙ Ù
ا Ø£Ø¯ÙØªÙ Ø¯Ø§ÙØ© اÙÙ
ÙØ¹Ø§Ù
ÙØ© Ø§ÙØ³Ø§Ø¨ÙØ©.
بذÙÙ ÙØØµÙ Ø¹ÙÙ Ù
ا ØØµÙÙØ§ عÙÙÙ Ù٠اÙÙ
Ø«Ø§Ù Ø§ÙØ³Ø§Ø¨Ù: 1 Ø«Ù
Ù 2 Ø«Ù
Ù 4Ø Ø§ÙÙØ±Ù ÙÙ Ø§ÙØªØ£Ø®Ùر ÙÙ
Ø¯ÙØ© ثاÙÙØ© بÙÙ ÙÙ٠استدعاء Ù
٠استدعاءات
alert.
بإعادة اÙÙØ¹Ùد ÙÙ
ÙÙÙØ§ Ø¨ÙØ§Ø¡ Ø³ÙØ³ÙØ© Ù
Ù Ø§ÙØ¥Ø¬Ø±Ø§Ø¡Ø§Øª ØºÙØ± اÙÙ
تزاÙ
ÙØ©.
٠ثاÙ: loadScript
ÙÙØ³ØªØ¹Ù
Ù ÙØ°Ù اÙÙ
ÙØ²Ø© Ù
ع Ø¯Ø§ÙØ© loadScript (Ø§ÙØªÙ ÙØªØ¨ÙØ§ÙØ§ Ù٠اÙÙØµÙ Ø§ÙØ³Ø§Ø¨Ù) ÙÙÙØÙ
Ù٠اÙÙØµÙص Ø§ÙØ¨Ø±Ù
Ø¬ÙØ© ÙØ§ØØ¯Ùا تÙÙ Ø§ÙØ¢Ø®Ø±:
loadScript("/article/promise-chaining/one.js")
.then(function(script) {
return loadScript("/article/promise-chaining/two.js");
})
.then(function(script) {
return loadScript("/article/promise-chaining/three.js");
})
.then(function(script) {
// ÙØ³ØªØ¹Ù
Ù Ø§ÙØ¯Ùا٠اÙÙ
عرÙ٠عÙÙØ§ Ù٠اÙÙØµÙص Ø§ÙØ¨Ø±Ù
Ø¬ÙØ©
// ÙÙØªØ£ÙÙØ¯ تÙ
اÙ
ÙØ§ بأÙÙÙØ§ ØÙÙ
ÙÙØª
one();
two();
three();
});
ÙÙ ÙÙÙØ§ Ø£ÙØ¶Ùا ØªÙØµÙر Ø§ÙØ´ÙÙØ±Ø© ÙÙÙÙÙØ§ Ø¨Ø§Ø³ØªØ¹Ù Ø§Ù Ø§ÙØ¯ÙØ§Ù Ø§ÙØ³ÙÙ ÙÙØ©:
loadScript("/article/promise-chaining/one.js")
.then(script => loadScript("/article/promise-chaining/two.js"))
.then(script => loadScript("/article/promise-chaining/three.js"))
.then(script => {
// Ø§ÙØªÙ
٠تØÙ
Ù٠اÙÙØµÙØµØ ÙÙ
ÙÙÙØ§ استعÙ
Ø§Ù Ø§ÙØ¯Ùا٠ÙÙÙØ§ Ø§ÙØ¢Ù
one();
two();
three();
});
ÙØ±Ù ÙÙØ§ Ø£ÙÙ ÙÙ٠استدعاء Ù
٠استدعاءات loadScript ÙÙØ¹Ùد ÙØ¹Ø¯ÙØ§Ø ÙÙØ¹Ù
Ù ØªØ§Ø¨ÙØ¹ â.then Ø§ÙØªØ§ÙÙ ÙÙ Ø§ÙØ³ÙØ³ÙØ© Ù
ت٠⦠اÙÙØ¹Ø¯. Ø¨Ø¹Ø¯ÙØ§
تبدأ Ø§ÙØ¯Ø§ÙØ© بتØÙ
Ù٠اÙÙØµ Ø§ÙØ¨Ø±Ù
Ø¬Ù Ø§ÙØªØ§ÙÙØ ÙÙÙØ°Ø§ ØªÙØÙ
ÙÙ ÙÙ٠اÙÙØµÙص ÙØ§ØØ¯Ùا بعد آخر.
ÙÙÙ
ÙÙÙØ§ Ø¥Ø¶Ø§ÙØ© Ù
ا ÙØ±Ùد Ù
٠إجراءات ØºÙØ± Ù
تزاÙ
ÙØ© Ø¥ÙÙ Ø§ÙØ³ÙØ³ÙØ©Ø ÙÙÙ ÙØ²Ùد Ø·ÙÙ Ø§ÙØ´ÙÙØ±Ø© Ø¥Ù٠اÙÙÙ
ÙÙØ ب٠إÙ٠أسÙÙØ ÙÙÙ ÙÙÙØ§Ø¨Ù ÙØ¬Ù â¦
ثاÙÙØ©Ù.
ÙÙ
ÙÙÙØ§ تÙÙÙÙØ§ Ø¥Ø¶Ø§ÙØ© ØªØ§Ø¨ÙØ¹ â.then Ø¯Ø§Ø®Ù Ø¯ÙØ§Ù loadScript Ù
باشرة٠ÙÙØ°Ø§:
loadScript("/article/promise-chaining/one.js").then(script1 => {
loadScript("/article/promise-chaining/two.js").then(script2 => {
loadScript("/article/promise-chaining/three.js").then(script3 => {
// â«ÙÙ
ÙÙ Ø£Ù ØªØµÙ ÙØ°Ù Ø§ÙØ¯Ø§ÙØ© Ø¥Ù٠اÙÙ
تغÙÙØ±Ø§Øª script1 Ùscript2 Ùscript3
one();
two();
three();
});
});
});
ÙØªØ¤Ø¯ÙÙ Ø§ÙØ´ÙÙØ±Ø© ÙÙØ³ Ø§ÙØ¹Ù
Ù: ØªÙØÙ
ÙÙ 3 ÙØµÙص برÙ
Ø¬ÙØ© Ø¨Ø§ÙØªØ±ØªÙب. اÙÙ
Ø´ÙÙØ© Ù٠أÙÙ Ø·ÙÙÙØ§ ÙØ²Ùد ÙØÙ Ø§ÙÙÙ
ÙÙ ÙÙÙ ÙÙØ³ Ù
Ø´ÙÙØ© Ø±Ø¯ÙØ¯
اÙÙØ¯Ø§Ø¡.
عادة٠Ù
ا ÙØ¬Ù٠اÙÙ
برÙ
جÙÙ Ø§ÙØ¬Ø¯Ø¯ Ø§ÙØ°ÙÙ ÙØ³ØªØ¹Ù
ÙÙ٠اÙÙØ¹Ùد Ù
ÙØ²Ø© Ø§ÙØ³ÙÙØ³ÙØ©Ø ÙÙÙØªØ¨ÙÙ Ø§ÙØ´ÙÙØ±Ø§Øª ÙÙØ°Ø§. ÙÙÙ٠سÙÙØ³ÙØ© اÙÙØ¹Ùد ÙÙ Ø§ÙØ£Ù
Ø«Ù
ÙØºØ§ÙØ¨ÙØ§ Ø§ÙØ£ÙضÙ.
ÙÙÙÙ٠استعÙ
ا٠.then Ù
باشرة٠أØÙاÙÙØ§ ÙØ§ ÙÙÙ٠باÙÙ
Ø´ÙÙØ© اÙÙØ¨ÙØ±Ø©Ø Ø¥Ø° ÙÙ
ÙÙ ÙÙØ¯Ùا٠اÙÙ
ØªØ¯Ø§Ø®ÙØ© اÙÙØµÙ٠إÙÙ â¦ Ø§ÙØ®Ø§Ø±Ø¬Ù. Ù٠اÙÙ
ثاÙ
Ø£Ø¹ÙØ§Ù Ù
Ø«ÙÙØ§ ÙÙ
ÙÙ ÙØ¢Ø®Ø± Ø±Ø¯Ù ÙØ¯Ø§Ø¡ Ù
تداخ٠اÙÙØµÙ٠إÙÙ ÙÙ٠اÙÙ
تغÙÙØ±Ø§Øª script1 Ùscript2 Ùscript3Ø Ø¥ÙÙØ§ Ø£ÙÙ ÙØ°Ø§ Ø§Ø³ØªØ«ÙØ§Ø¡ عÙ
اÙÙØ§Ø¹Ø¯Ø© ÙÙÙØ³ ÙØ§Ø¹Ø¯Ø© Ø¨ØØ¯Ù Ø°Ø§ØªÙØ§.
Ù
ÙØ§ØØ¸Ø©: ÙØ§Ø¦Ùات Thenables
عÙÙ ÙØ¬Ù Ø§ÙØ¯ÙØ©Ø ÙØ§ ØªØ¹ÙØ¯ اÙÙ
Ø¹Ø§ÙØ¬Ø§Øª ÙØ¹ÙØ¯ÙØ§ ÙØ¥ÙÙ
ا ØªØ¹ÙØ¯ ÙØ§Ø¦Ù thenable â ÙÙÙ ÙØ§Ø¦Ù Ø¹Ø´ÙØ§Ø¦Ù ÙÙ ÙÙØ³ ØªÙØ§Ø¨Ø¹ .then. ÙÙØªØ¹Ø§Ù
Ù Ù
عÙ
بÙÙØ³ طرÙÙØ© Ø§ÙØªØ¹Ø§Ù
Ù Ù
ع اÙÙØ¹Ø¯.
اÙÙÙØ±Ø© Ø£Ù Ù
ÙØªØ¨Ø§Øª Ø§ÙØ®Ø§Ø±Ø¬ÙØ© تÙÙØ° ÙØ§Ø¦Ùات خاصة Ø¨ÙØ§ "Ù
ØªÙØ§ÙÙØ© Ù
ع اÙÙØ¹Ø¯". ÙÙÙ
Ù٠أ٠ÙÙ
ÙÙÙØ§ Ù
جÙ
ÙØ¹Ø© ØªÙØ§Ø¨Ø¹ Ù
ÙØ³Ùعة. ÙÙÙÙ ÙØ¬Ø¨ Ø£Ù
ÙØªÙاÙÙÙØ§ Ù
ع اÙÙØ¹Ùد Ø§ÙØ£ØµÙÙØ©Ø ÙØ£ÙÙÙ
ÙÙÙØ°ÙÙ .then.
ÙØ¥ÙÙÙ Ù
ثاÙÙØ§ عÙÙ ÙØ§Ø¦Ù thenable:
class Thenable {
constructor(num) {
this.num = num;
}
then(resolve, reject) {
alert(resolve); // function() { native code }
// â«Ø¥Ùجاز اÙÙØ¹Ø¯ ÙØªØÙÙÙÙ Ù
ع this.num*2 بعد ثاÙÙØ©
setTimeout(() => resolve(this.num * 2), 1000); // (**)
}
}
new Promise(resolve => resolve(1))
.then(result => {
return new Thenable(result); // (*)
})
.then(alert); // shows 2 after 1000ms
تتØÙÙ Ø¬Ø§ÙØ§ Ø³ÙØ±Ùبت Ù
٠اÙÙØ§Ø¦Ù اÙÙ
ÙØ¹Ø§Ø¯ Ù
Ù Ù
Ø¹Ø§ÙØ¬ .then ÙÙ Ø§ÙØ³Ø·Ø± (*): Ø¥Ù ÙØ¯Ù٠تابع ÙØ§Ø¨Ù ÙÙØ§Ø³ØªØ¯Ø¹Ø§Ø¡ ÙØ¯Ø¹Ù then Ø¹ÙØ¯Ùا
Ø³ÙØ³ØªØ¯Ø¹Ù Ø°Ø§Ù Ø§ÙØªØ§Ø¨Ø¹ Ù
Ø²ÙØ¯Ùا بذÙÙ Ø¨Ø§ÙØªÙابع Ø§ÙØ£ØµÙÙØ© Ù
Ø«Ù: resolve Ù reject ÙÙØ³Ø·Ø§Ø¡ (Ù
شاب٠ÙÙÙ
ÙÙØ°) ÙÙÙØªØ¸Ø± ØØªÙ ÙØ³ØªØ¯Ø¹Ù
ÙØ§ØØ¯Ùا Ù
ÙÙÙ
. Ù٠اÙÙ
Ø«Ø§Ù Ø£Ø¹ÙØ§Ù تستدع٠resolve(2) بعد ثاÙÙØ© Ø§ÙØ¸Ø± (**). Ø¨Ø¹Ø¯ÙØ§ تÙ
رر اÙÙØªÙجة Ø¥Ù٠أسÙÙ Ø§ÙØ³ÙØ³ÙØ©.
ØªØªÙØ ÙÙØ§ ÙØ°Ù اÙÙ
Ù
ÙØ²Ø§Øª دÙ
ج اÙÙØ§Ø¦Ùات اÙÙ
خصصة Ù
ع Ø³ÙØ§Ø³Ù اÙÙØ¹Ùد دÙÙ Ø§ÙØØ§Ø¬Ø© Ø¥Ù٠اÙÙØ±Ø§Ø«Ø© Ù
٠اÙÙØ¹Ø¯ Promise.
٠ثا٠أضخ٠: fetch
عادة٠٠ا ÙØ³ØªØ¹Ù ٠اÙÙØ¹Ùد Ù٠بر٠جة اÙÙØ§Ø¬Ùات Ø§ÙØ±Ø³ÙÙ ÙØ© ÙØ·Ùبات Ø§ÙØ´Ø¨ÙØ©. ÙÙØ±Ù Ø§ÙØ¢Ù ٠ثاÙÙØ§ Ø£ÙØ³Ø¹ ٠جاÙÙØ§ ÙÙÙÙÙØ§. Ø³ÙØ³ØªØ¹Ù Ù Ø§ÙØªØ§Ø¨Ùع ÙØªØÙ Ù٠بعض اÙ٠عÙÙ٠ات Ø§ÙØªÙ تخص٠اÙÙ Ø³ØªØ®Ø¯Ù Ù Ù Ø§ÙØ®Ø§Ø¯ÙÙ Ø§ÙØ¨Ø¹Ùد. ÙÙØ°Ø§ Ø§ÙØªØ§Ø¨Ùع Ù Ø¹Ø§Ù ÙØ§Øª ÙØ«Ùرة Ø§Ø®ØªÙØ§Ø±ÙØ© ÙØªØ¨Ùا Ø¹ÙØ§ ÙÙ ÙØµÙ٠٠ختÙÙØ©Ø Ø¥ÙÙØ§ Ø£ÙÙ ØµÙØ§ØºØªÙ Ø§ÙØ£Ø³Ø§Ø³ÙØ© Ø¨Ø³ÙØ·Ø© Ø¥ÙÙ ØØ¯Ù ٠ا:
let promise = fetch(url);
ÙÙØ°Ø§ ÙÙØ±Ø³Ù Ø·ÙØ¨Ùا شبÙÙÙØ§ Ø¥ÙÙ Ø§ÙØ¹ÙÙØ§Ù url ÙÙØ³ØªÙÙ
ÙØ¹Ø¯Ùا. â¦â¦ Ù
ا Ø¥Ù ÙØ±Ø¯Ù Ø§ÙØ®Ø§Ø¯Ù
Ø§ÙØ¨Ø¹Ùد بترÙÙØ³Ø§Øª Ø§ÙØ·ÙØ¨Ø ÙÙÙÙ ÙØ¨Ù ØªÙØ²ÙÙ Ø§ÙØ±Ø¯Ù
ÙØ§Ù
ÙÙØ§.
عÙÙÙØ§ استدعاء Ø§ÙØªØ§Ø¨Ùع response.text()â ÙÙØ±Ø§Ø¡Ø© Ø§ÙØ±Ø¯Ù ÙØ§Ù
ÙÙØ§Ø ÙÙÙ ÙÙØ¹Ùد ÙØ¹Ø¯Ùا ⦠Ù
ت٠ÙÙØ²Ù٠اÙÙØµ اÙÙØ§Ù
Ù Ù
Ù Ø§ÙØ®Ø§Ø¯ÙÙ
Ø§ÙØ¨Ø¹ÙدØ
ÙÙØ§ØªØ¬Ù ÙÙÙ٠ذÙ٠اÙÙØµ.
ØªÙØ±Ø³Ù Ø§ÙØ´ÙÙØ±Ø© أسÙÙÙ Ø·ÙØ¨Ùا Ø¥ÙÙ user.json ÙØªØÙ
ÙÙ ÙØµÙÙ Ù
Ù Ø§ÙØ®Ø§Ø¯ÙÙ
:
fetch("/article/promise-chaining/user.json")
// â«Ø¥Ù â.then تعÙ
Ù Ø¹ÙØ¯Ù
ا ÙØ³ØªØ¬Ùب Ø§ÙØ®Ø§Ø¯Ù
Ø§ÙØ¨Ø¹Ùد
.then(function(response) {
// â«Ø¥Ù Ø§ÙØªØ§Ø¨Ø¹ response.text()â ÙÙØ¹Ùد ÙØ¹Ø¯Ùا Ø¬Ø¯ÙØ¯Ùا ÙØ§ÙØ°Ù ÙØ¹Ø§Ø¯ Ù
ع ÙØ§Ù
Ù ÙØµ Ø§ÙØ§Ø³ØªØ¬Ø§Ø¨Ø©
// Ø¹ÙØ¯Ù
ا ÙÙØÙ
ÙÙ
return response.text();
})
.then(function(text) {
// â«...ÙÙÙØ§ سÙÙÙÙ Ù
ØØªÙ٠اÙÙ
ÙÙ Ø§ÙØ¨Ø¹Ùد
alert(text); // {"name": "iliakan", isAdmin: true}
});
ÙÙ
ا Ø£ÙÙ ÙÙØ§Ù Ø§ÙØªØ§Ø¨Ùع response.json()â ÙØ§Ùذ٠ÙÙØ±Ø£ Ø§ÙØ¨ÙØ§ÙØ§Øª اÙÙ
ستÙÙ
Ø© Ø§ÙØ¨Ø¹Ùدة ÙÙØÙÙÙÙØ§ عÙ٠أÙÙÙØ§ JSON. ÙÙ ØØ§ÙØªÙØ§ ÙØ°Ø§ Ø£ÙØ¶Ù
ÙØ£Ø³ÙÙ ÙÙÙÙØ§ ÙØ³ØªØ¹Ù
ÙÙ.
ÙÙ
ا ÙØ³ÙستعÙ
Ù Ø§ÙØ¯ÙØ§Ù Ø§ÙØ³ÙÙ
ÙÙØ© ÙÙØ§Ø®ØªØµØ§Ø± ÙÙÙÙÙØ§:
// â«Ù
شاب٠ÙÙÙ
Ø«Ø§Ù Ø£Ø¹ÙØ§Ù ÙÙÙÙ Ø§ÙØªØ§Ø¨Ø¹ response.json()â ÙØÙ٠اÙÙ
ØØªÙÙ Ø§ÙØ¨Ø¹Ùد ÙÙ
ÙÙ JSON
fetch('/article/promise-chaining/user.json')
.then(response => response.json())
.then(user => alert(user.name)); // iliakan, got user name
Ø§ÙØ¢Ù ÙÙØµÙع Ø´ÙØ¦Ùا Ø¨ÙØ°Ø§ اÙÙ Ø³ØªØ®Ø¯Ù Ø§ÙØ°Ù ØÙ ÙÙÙØ§Ù. ÙÙ ÙÙÙØ§ Ù Ø«ÙÙØ§ إجراء Ø·ÙØ¨Ø§Øª Ø£ÙØ«Ø± Ù Ù ØºÙØªâÙÙØ¨ ÙØªØÙ ÙÙ Ù Ù٠اÙÙ Ø³ØªØ®Ø¯Ù Ø§ÙØ´Ø®ØµÙ ÙØ¹Ø±Ø¶ ØµÙØ±ØªÙ:
Now letâs do something with the loaded user.
For instance, we can make one more request to GitHub, load the user profile and show the avatar:
// Make a request for user.json
fetch('/article/promise-chaining/user.json')
// â«ØÙ
ÙÙ ÙÙØ£ÙÙ Ù
ÙÙ json
.then((response) => response.json())
// â«Ø£Ùشئ Ø·ÙØ¨ ÙÙÙ GitHub
.then((user) => fetch(`https://api.github.com/users/${user.name}`))
// â«ØÙ
ÙÙ Ø§ÙØ±Ø¯ ÙÙ
ÙÙ json
.then((response) => response.json())
// â«Ø£Ø¸Ùر Ø§ÙØµÙرة Ø§ÙØ±Ù
Ø²ÙØ© (avatar) Ù
Ù (githubUser.avatar_url) ÙÙ
دة 3 Ø«ÙØ§ÙÙ
.then((githubUser) => {
let img = document.createElement('img');
img.src = githubUser.avatar_url;
img.className = 'promise-avatar-example';
document.body.append(img);
setTimeout(() => img.remove(), 3000); // (*)
});
Ø§ÙØ´ÙÙØ±Ø© تعÙ
٠عÙ٠أÙÙ
Ù ÙØ¬Ù (طاÙÙØ¹ Ø§ÙØªØ¹ÙÙÙØ§Øª ÙØªØ¹Ø±Ù Ø§ÙØªÙاصÙÙ). ÙÙÙÙ ÙÙØ§Ù Ù
Ø´ÙÙØ© ÙÙÙ ÙØ¯ ØªØØ¯Ø«Ø ÙÙ٠خطأ شائع ÙÙØ¹ ÙÙÙ Ù
Ù
ÙØ³ØªØ¹Ù
٠اÙÙØ¹Ùد Ø£ÙÙÙ Ù
Ø±ÙØ©.
طاÙÙØ¹ Ø§ÙØ³Ø·Ø± (*): ÙÙÙ ÙÙ
Ù٠أ٠ÙÙØ¹Ù Ù
ÙÙ
ÙØ© Ù
عÙÙØ© Ù
ØªÙ Ø§ÙØªÙ
٠عرض Ø§ÙØµÙرة ÙØ£ÙزÙÙØªØ ÙÙÙÙÙ Ù
Ø«ÙÙØ§ Ø³ÙØ¹Ø±Ø¶ استÙ
ارة ÙØªØØ±Ùر
ذÙ٠اÙÙ
ستخدÙ
أ٠أÙÙ Ø´ÙØ¡ آخر. ØØ§ÙÙÙØ§â¦ ذÙÙ Ù
ستØÙÙ.
ÙÙÙØ¯Ø± عÙÙ Ù
ÙØ§ØµÙØ© Ø§ÙØ³ÙØ³ÙØ© عÙÙÙØ§ إعادة ÙØ¹Ø¯ اÙÙ
ÙÙØ¬Ø² Ù
ØªÙ Ø§ÙØªÙ
٠عرض Ø§ÙØµÙرة.
ÙÙØ°Ø§:
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(function(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);
}))
// ÙØØ¯Ø« بعد 3 Ø«ÙØ§ÙÙ
.then(githubUser => alert(`Finished showing ${githubUser.name}`));
ÙÙØ°Ø§ صارت ØªÙØ¹Ùد Ø¯Ø§ÙØ© اÙÙ
ÙØ¹Ø§Ù
ÙØ© ÙÙ .then Ø¹ÙØ¯ Ø§ÙØ³Ø·Ø± (*) ÙØ§Ø¦ÙÙ new Promise ÙØ§ ⦠إÙÙØ§ بعد استدعاء
resolve(githubUser)â ÙÙ setTimeout Ø¹ÙØ¯ (**).
ÙØ³ÙÙØªØ¸Ø± ØªØ§Ø¨ÙØ¹ â.then Ø§ÙØªØ§ÙÙ ÙÙ Ø§ÙØ³ÙØ³ÙØ© Ø§ÙØªÙ
ا٠ذÙÙ.
ØªÙØ¹Ø¯ إعادة Ø§ÙØ¥Ø¬Ø±Ø§Ø¡Ø§Øª ØºÙØ± اÙÙ
تزاÙ
ÙØ© ÙÙÙØ¹Ùد دÙÙ
ÙØ§ Ø¥ØØ¯Ù اÙÙ
Ù
ارسات Ø§ÙØµØÙØØ© ÙÙ Ø§ÙØ¨Ø±Ù
جة.
ÙÙØ°Ø§ ÙØ³ÙÙ٠عÙÙÙØ§ Ø§ÙØªØ®Ø·ÙØ· ÙÙØ¥Ø¬Ø±Ø§Ø¡Ø§Øª Ø§ÙØªÙ Ø³ØªØµÙØ± بعد ÙØ°Ø§Ø ÙØØªÙÙ ÙÙ ÙÙ
ÙØ±Ùد ØªÙØ³Ø¹Ø© Ø§ÙØ³ÙØ³ÙØ© Ø§ÙØ¢Ù ÙØ±Ø¨ÙÙ
ا Ø§ØØªØ¬Ùا Ø¥Ù٠ذÙÙ ÙØ§ØÙÙØ§.
ÙØ£Ø®ÙØ±ÙØ§Ø ÙÙ
ÙÙÙØ§ Ø£ÙØ¶Ùا ØªÙØ³ÙÙ
Ø§ÙØ´ÙÙØ±Ø© Ø¥ÙÙ Ø¯ÙØ§Ù ÙÙ
Ù٠إعادة استعÙ
اÙÙØ§:
function loadJson(url) {
return fetch(url)
.then(response => response.json());
}
function loadGithubUser(name) {
return fetch(`https://api.github.com/users/${name}`)
.then(response => response.json());
}
function showAvatar(githubUser) {
return new Promise(function(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);
});
}
// ÙØ³ØªØ¹Ù
ÙÙØ§ Ø§ÙØ¢Ù:
loadJson('/article/promise-chaining/user.json')
.then(user => loadGithubUser(user.name))
.then(showAvatar)
.then(githubUser => alert(`Finished showing ${githubUser.name}`));
// Ø§ÙØªÙ
٠عرض ÙØ°Ø§ // ...
Ø®ÙØ§ØµØ©
إ٠أعادت Ø¯Ø§ÙØ© Ù
ÙØ¹Ø§Ù
ÙØ© â.then (Ø£Ù catch/finallyØ ÙØ§ ÙÙÙ
Ù ØÙÙØ§) ÙØ¹Ø¯ÙØ§Ø ÙØªÙتظر بÙÙØ© Ø§ÙØ³ÙØ³ÙØ© ØØªÙ٠تÙÙØ¬Ø² Ù
ØªÙ ØØ¯Ø« ذÙÙ ÙÙÙ
Ø±ÙØ±
اÙÙØ§ØªØ¬ (Ø£Ù Ø§ÙØ®Ø·Ø£) Ø¥ÙÙ Ø§ÙØªÙ Ø¨Ø¹Ø¯ÙØ§.
Ø¥ÙÙÙ Ø§ÙØµÙرة اÙÙØ§Ù
ÙØ©:
[promise-handler-variants.png]
ت٠ارÙÙ
اÙÙØ¹Ø¯: then Ùcatch
Ù٠تؤدÙÙ ÙØ§ØªÙÙ Ø§ÙØ´ÙÙØ±ØªÙÙ ÙÙØ³ Ø§ÙØºØ±Ø¶Ø Ø£Ù ÙÙ ÙØªØ·Ø§Ø¨Ù سÙÙÙÙ٠ا ÙÙ Ø§ÙØØ§ÙØ§Øª اÙ٠ختÙÙØ©Ø ÙØ£ÙÙ٠ا ÙØ§Ùت Ø¯ÙØ§Ù اÙÙ ÙØ¹Ø§Ù ÙØ©Ø
promise.then(f1).catch(f2);
Ù ÙØ§Ø¨Ù:
promise.then(f1, f2);
Ø§ÙØÙ
Ø§ÙØ¬Ùاب اÙÙ
ختصر: ** ÙØ§ ÙÙØ³Ø§ Ù
تساÙÙÙÙ**:
اÙÙØ±Ù Ø£ÙÙ Ø¥Ù ØØ¯Ø« خطأ ÙÙ f1 ÙØ³ØªØ¹Ø§ÙØ¬ÙØ§ â.catch ÙÙØ§:
promise
.then(f1)
.catch(f2);
â¦ÙÙÙ ÙÙØ³ ÙÙØ§:
promise
.then(f1, f2);
ÙØ°Ù٠بسبب تÙ
Ø±ÙØ± Ø§ÙØ®Ø·Ø£ ÙØ£Ø³ÙÙ Ø§ÙØ³ÙØ³ÙØ©Ø ÙÙÙ Ø§ÙØ¬Ø²Ø¡ Ø§ÙØ«Ø§ÙÙ Ù
Ù Ø§ÙØ´ÙÙØ±Ø© ÙØ§ ÙÙØ¬Ø¯ Ø³ÙØ³ÙØ© Ø£ÙÙ Ù
Ù f1.
بÙ
عÙ٠آخر ÙÙ
رر â.then اÙÙØªÙجة Ø£Ù Ø§ÙØ®Ø·Ø£ Ø¥ÙÙ â.then/catch Ø§ÙØªØ§ÙÙØ©. ÙØ°Ø§ Ù٠اÙÙ
Ø«Ø§Ù Ø§ÙØ£ÙÙ ÙÙØ¬Ø¯ catch بÙÙÙ
ا Ù٠اÙÙ
ثاÙ
Ø§ÙØ«Ø§ÙÙ ÙØ§ ÙÙØ¬Ø¯. ÙÙØ°ÙÙ ÙÙ
ÙØ¹Ø§Ùج Ø§ÙØ®Ø·Ø£.
ترجÙ
Ø© -ÙØ¨ØªØµØ±Ù- ÙÙÙØµÙ Promises chaining Ù
Ù
ÙØªØ§Ø¨ The JavaScript language
Ø§ÙØªØ¹ÙÙÙØ§Øª
<code>Ø ÙÙÙÙØ«Ùر Ù Ù Ø§ÙØ³Ø·Ùر استخدÙ<pre>Ø ÙÙØ£Ùثر Ù Ù 10 Ø³Ø·ÙØ± استخد٠(plnkr, JSBin, codepenâ¦)