Promise (مانند callbacks) به ما اجازه میده تا منتظر اجرای یک قطعه کد خاص بمونیم تا قطعه کد بعدی اجرا بشه.
در جاوااسکریپت Promise نشان دهنده نتیجه یک عملیات ناهمزمان است . Promise رو میشه به عنوان یک نگهدارنده تصور کرد. این نگهدارنده در واقع یک object است که میتونیم callbacks رو بهش پیوست کنیم.
Promiseها میتونن یکی از سه حالت زیر داشته باشند:
اما خارج از این تعاریف شما Promise رو میتونید دقیقا هم معنی خود کلمه در نظر بگیرید... یه قول..
(این داده در دسترس نیست اما هنگامی که بود، قول میدیم اون ره به شما ارجاع بدیم)
بعضی کار ها در برنامه نویسی تحت وب، نتیجه رو در لحظه به ما میده مثلا محاسبات و غیره ... اما بعضی کارها مثل دریافت اطلاعات از API زمان بر هستند (شما درخواست ارسال میکنی و بعد از مدت حدودا ۱ ثانیه جواب میگیری)
این وقفه مشکلی رو بوجود میاره و اون اینه که: اون لحظه (لحظه ارسال درخواست) ما دسترسی به داده ها نداریم چون هنوز زمان سپری نشده و پاسخ درخواست هنوز به ما نرسیده...
پس از یه Promise استفاده میکنیم و این Promise به ما این امکان رو میده که پس از تاخیر بوجود آمده یه Callback رو صدا بزنیم..
..
promis قابلیت جدیدی از جاوااسکریپته که تو ES6 معرفی شد، یه جایگزین خوب برای رهایی از جهنم callback function هاست
@mrhajimaghsoodi
خودمم میدونم جدیده کاربردش میخام بدونم به چه شکل هست؟وبدرد چه چیزی میخوره
مبحث مرتبط به promise، کدهای ناهمگام (asynchronous) هستش.
در حالت عادی کدها خط به خط از بالا به پایین اجرا می شوند. ولی زمان هایی هست که وقتی ما کدی رو می نویسیم، بصورت آنی اجرا نمیشه و یک زمانی می بره تا کد اجرا بشه (مثلا ما یک درخواست به سرور فرستادیم و طول میکشه تا پردازش صورت بگیره و جوابش رو به ما بده)، درین حالت موتور جاوااسکریپت منتظر نمی مونه که اون کدها جواب شون بیادش و میره به خط بعدی و همینطور کدهای بعدی رو اجرا می کنه.
تا اینکه جواب اون کدها هم بیاد و اون رو هم اجرا می کنه.
به این می گن مبحث ناهمگامی asynchronous.
بعدش در گذشته راه حل اینجور مسائل توابع callback بودند، اما مشکل شون اینه که کدها خوانش خیلی بدی پیدا می کردند و بصورت تودرتو می شدند (جهنم callback). بعدا در es6 روش promise مطرح شدش.
سپس در es7-8 به کمک async/await راه حل promise بهبود داده شد.
@milad
یعنی وقتی من با پرامیس(درست نوشتم یانه) کار میکنم درخواست اجاکس من ارسال میشه و جاوااسکریپت بقیه کدهارو پردازش میکنه و منتظر دستور من نمیمونه؟میشه مثالی برای من پیدا کنین چطوری پرامیس با آجاکس ادغام میشه؟
ببین، AJAX یک نوع خاصی از عملیات های ناهمگام بحساب میادش. وقتی این عملیات ناهمگام رخ میده می تونی به روش قدیمی با callback ها XMLHttpRequest interface برآوردش کنی یا به روش جدید با استفاده از promise همراه با fetch() interface.
به اینجا رجوع کن، مثال هم داره:
https://stackoverflow.com/questions/39751395/whats-the-difference-between-promise-and-ajax
یعنی وقتی من با پرامیس(درست نوشتم یانه) کار میکنم درخواست اجاکس من ارسال میشه و جاوااسکریپت بقیه کدهارو پردازش میکنه و منتظر دستور من نمیمونه؟میشه مثالی برای من پیدا کنین چطوری پرامیس با آجاکس ادغام میشه؟
بله همین پِرامیس (معادل لغت promise به معنی قول، وعده).
موتور جاوااسکریپت منتظر دستور شما هستش، ولی در پس زمینه و پشت صحنه منتظر می مونه، در عین حال خطوط کد رو پیمایش می کنه و ادامه میده، اما در پشت صحنه یک صف داره تا درخواست های ناهمزمانی که برآورده میشن رو، بعدش اجرا کنه.
@milad
درود من با ajax و promise رو تونستم اینجوری ادغام کنم درسته؟
var prom=new Promise((resolve, reject)=>{
$.ajax({
url:'site.ir/dsfsd',
type:'get',
success:resolve,
error:reject,
}).then((res)=>{
alert(res)
}).catch(()=>{
alert('error')
})
})
نتیجه هم داد
Promise (مانند callbacks) به ما اجازه میده تا منتظر اجرای یک قطعه کد خاص بمونیم تا قطعه کد بعدی اجرا بشه.
در جاوااسکریپت Promise نشان دهنده نتیجه یک عملیات ناهمزمان است . Promise رو میشه به عنوان یک نگهدارنده تصور کرد. این نگهدارنده در واقع یک object است که میتونیم callbacks رو بهش پیوست کنیم.
Promiseها میتونن یکی از سه حالت زیر داشته باشند:
اما خارج از این تعاریف شما Promise رو میتونید دقیقا هم معنی خود کلمه در نظر بگیرید... یه قول..
(این داده در دسترس نیست اما هنگامی که بود، قول میدیم اون ره به شما ارجاع بدیم)
بعضی کار ها در برنامه نویسی تحت وب، نتیجه رو در لحظه به ما میده مثلا محاسبات و غیره ... اما بعضی کارها مثل دریافت اطلاعات از API زمان بر هستند (شما درخواست ارسال میکنی و بعد از مدت حدودا ۱ ثانیه جواب میگیری)
این وقفه مشکلی رو بوجود میاره و اون اینه که: اون لحظه (لحظه ارسال درخواست) ما دسترسی به داده ها نداریم چون هنوز زمان سپری نشده و پاسخ درخواست هنوز به ما نرسیده...
پس از یه Promise استفاده میکنیم و این Promise به ما این امکان رو میده که پس از تاخیر بوجود آمده یه Callback رو صدا بزنیم..
..
@paressep28
به نظرم که درست میادش.
@ali.bayat
خیلی ممنون جناب بیات، توضیحات تون خیلی گویا بودش و لذت بردم از متن تون. توضیحاتی هم که در خصوص خود کلمه Promise به معنی قول دادید و دلیل نام گذاری رو هم بیان کردید خیلی جالب بودش.
اگر ممکنه چند خطی هم در خصوص بهبود promise ها با async/await بفرمایید.
@milad
درود..
برنامه نویسی ناهمگام (Asynchronous) یکی از خصوصیات پیش بینی شده جاوا اسکریپت است تا کار با توابع ناهمگام (غیرهمزمان ) را آسانتر و قابل درک تر سازد. اگر بخواهیم چنین خصوصیتی در جاوااسکریپت رو بررسی کنیم:
نکات زیر در مورد این توابع صدق میکنه:
اما اگر دوباره بخواهیم خارج از تعاریف و مختصر بگیم:
هدف توابع async/await سادهسازی استفاده از Promise ها به صورت همزمان و اعمال یک سری رفتار روی Promise هاست..
همونطور که Promise ها، شبیه به Callback های ساختار یافته هستند.. async/await هم شبیه به ترکیب Promise ها و Generator هاست
ممکنه یه سوال هم ایجاد بشه که چرا باید از چنین قابلیتی استفاده کنیم؟ وقتی با Promise هم میشه اون کار رو انجام داد؟ و دلایلش هم به شرح زیره:
پیروز باشید.
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟