ارزش وعده داده شده
ارزش وعده داده شده
قطعاً بعداً در فصل به جزئیات بیشتری در مورد Promises خواهیم پرداخت — بنابراین اگر برخی از این موارد گیج کننده است نگران نباشید —
اما اجازه دهید به طور خلاصه نگاهی اجمالی به نحوه بیان مثال x + y از طریق Promise s بیندازیم:
function add(xPromise,yPromise) {
// `Promise.all([ .. ])` takes an array of promises,
// and returns a new promise that waits on them
// all to finish
return Promise.all( [xPromise, yPromise] )
// when that promise is resolved, let’s take the
// received `X` and `Y` values and add them together.
.then( function(values){
// `values` is an array of the messages from the
// previously resolved promises
return values[0] + values[1];
} );
}
// `fetchX()` and `fetchY()` return promises for
// their respective values, which may be ready
// *now* or *later*.
add( fetchX(), fetchY() )
// we get a promise back for the sum of those
// two numbers.
// now we chain-call `then(..)` to wait for the
// resolution of that returned promise.
.then( function(sum){
console.log( sum ); // that was easier!
} );
در این قطعه دو لایه Promises وجود دارد.
fetchX() و fetchY() مستقیماً فراخوانی می شوند و مقادیری که برمی گردانند (وعده می دهد!) به add(..) منتقل می شوند. ارزشهای زیربنایی که این وعدهها نشان میدهند ممکن است اکنون یا بعداً آماده باشند، اما هر قول بدون توجه به یکسان بودن رفتار را عادی میکند. ما در مورد مقادیر X و Y به روشی مستقل از زمان استدلال می کنیم. آنها ارزش های آینده هستند.
لایه دوم وعده ای است که add(..) ایجاد می کند (از طریق Promise.all([ .. ])) و برمی گرداند که با فراخوانی then(..) منتظر می مانیم. وقتی عملیات add(..) کامل شد، مقدار آتی جمع ما آماده است و می توانیم آن را چاپ کنیم. منطق انتظار بر روی مقادیر آینده X و Y را در داخل add(..) پنهان می کنیم.
توجه: در داخل add(..) ، فراخوانی Promise.all([ .. ]) یک وعده ایجاد می کند (که در انتظار حل و فصل sozX است). فراخوانی زنجیرهای به .then(..) وعده دیگری ایجاد میکند، که خط بازگشتی مقادیر[0] + مقادیر[1] بلافاصله آن را حل میکند (با نتیجه جمع). بنابراین، فراخوانی then(..) که از انتهای فراخوان add(..) زنجیره می زنیم – در انتهای قطعه – در واقع بر روی دومین وعده بازگشتی عمل می کند، نه اولین وعده ایجاد شده توسط Promise. همه([ .. ]) . همچنین، اگرچه ما پایان آن ثانیه را زنجیر نمی کنیم (..) ، اما اگر ما انتخاب کرده بودیم که آن را رعایت کنیم/استفاده کنیم، قول دیگری نیز ایجاد کرده است. این چیزهای زنجیرهای وعده با جزئیات بسیار بیشتر در این فصل توضیح داده خواهد شد.
درست مانند سفارشات چیزبرگر، این امکان وجود دارد که حل یک قول به جای تحقق، رد کردن باشد. بر خلاف یک Promise محقق شده، که در آن مقدار همیشه برنامهریزی شده است، یک مقدار رد – که معمولاً “دلیل رد” نامیده میشود – میتواند مستقیماً توسط منطق برنامه تنظیم شود یا میتواند به طور ضمنی از یک استثنا در زمان اجرا منتج شود.
با Promises، فراخوانی then(..) در واقع می تواند دو تابع داشته باشد، اولی برای انجام (همانطور که قبلا نشان داده شد)، و دومی برای رد کردن:
add( fetchX(), fetchY() )
.then(
// fullfillment handler
function(sum) {
console.log( sum );
},
// rejection handler
function(err) {
console.error( err ); // bummer!
}
);
قوانین ارسال دیدگاه در سایت