علیرضا
5 سال پیش توسط علیرضا مطرح شد
11 پاسخ

کاربرد Promise

سلام ببخشید کاربرد Promise برای چیه ؟میشه مثالی بزنید متوجه بشم؟واینکه تو جی کوئری چطور ازش استفاده میشه؟


ثبت پرسش جدید
علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 5 سال پیش مطرح شد
3

Promise (مانند callbacks) به ما اجازه میده تا منتظر اجرای یک قطعه کد خاص بمونیم تا قطعه کد بعدی اجرا بشه.

در جاوااسکریپت Promise نشان دهنده نتیجه یک عملیات ناهمزمان است . Promise رو میشه به عنوان یک نگهدارنده تصور کرد. این نگهدارنده در واقع یک object است که میتونیم callbacks رو بهش پیوست کنیم.

Promiseها میتونن یکی از سه حالت زیر داشته باشند:

  • Pending : عملیات هنوز کامل نشده است.
  • Fulfilled : عملیات کامل شده و Promise دارای یک مقدار است.
  • Rejected  : عملیات انجام شده اما شکست خورده یا با مشکل روبرو شده است.

اما خارج از این تعاریف شما Promise رو می‌تونید دقیقا هم معنی خود کلمه در نظر بگیرید... یه قول..
(این داده در دسترس نیست اما هنگامی که بود، قول میدیم اون ره به شما ارجاع بدیم)

بعضی کار ها در برنامه نویسی تحت وب، نتیجه رو در لحظه به ما میده مثلا محاسبات و غیره ... اما بعضی کارها مثل دریافت اطلاعات از API زمان بر هستند (شما درخواست ارسال میکنی و بعد از مدت حدودا ۱ ثانیه جواب میگیری)
این وقفه مشکلی رو بوجود میاره و اون اینه که: اون لحظه (لحظه ارسال درخواست) ما دسترسی به داده ها نداریم چون هنوز زمان سپری نشده و پاسخ درخواست هنوز به ما نرسیده...

پس از یه Promise استفاده میکنیم و این Promise به ما این امکان رو میده که پس از تاخیر بوجود آمده یه Callback رو صدا بزنیم..
..


محمدرضا حاجی مقصودی
تخصص : Full-Stack JS
@mrhajimaghsoodi 5 سال پیش مطرح شد
1

promis قابلیت جدیدی از جاوااسکریپته که تو ES6 معرفی شد، یه جایگزین خوب برای رهایی از جهنم callback function هاست


علیرضا
تخصص : فرانت اند وب
@sep28 5 سال پیش مطرح شد
0

@mrhajimaghsoodi
خودمم میدونم جدیده کاربردش میخام بدونم به چه شکل هست؟وبدرد چه چیزی میخوره


میلاد-م
تخصص : توسعه‌دهنده رابط کاربری - Fron...
@milad 5 سال پیش مطرح شد
2

مبحث مرتبط به promise، کدهای ناهمگام (asynchronous) هستش.
در حالت عادی کدها خط به خط از بالا به پایین اجرا می شوند. ولی زمان هایی هست که وقتی ما کدی رو می نویسیم، بصورت آنی اجرا نمیشه و یک زمانی می بره تا کد اجرا بشه (مثلا ما یک درخواست به سرور فرستادیم و طول میکشه تا پردازش صورت بگیره و جوابش رو به ما بده)، درین حالت موتور جاوااسکریپت منتظر نمی مونه که اون کدها جواب شون بیادش و میره به خط بعدی و همینطور کدهای بعدی رو اجرا می کنه.
تا اینکه جواب اون کدها هم بیاد و اون رو هم اجرا می کنه.
به این می گن مبحث ناهمگامی asynchronous.

بعدش در گذشته راه حل اینجور مسائل توابع callback بودند، اما مشکل شون اینه که کدها خوانش خیلی بدی پیدا می کردند و بصورت تودرتو می شدند (جهنم callback). بعدا در es6 روش promise مطرح شدش.
سپس در es7-8 به کمک async/await راه حل promise بهبود داده شد.


علیرضا
تخصص : فرانت اند وب
@sep28 5 سال پیش مطرح شد
0

@milad
یعنی وقتی من با پرامیس(درست نوشتم یانه) کار میکنم درخواست اجاکس من ارسال میشه و جاوااسکریپت بقیه کدهارو پردازش میکنه و منتظر دستور من نمیمونه؟میشه مثالی برای من پیدا کنین چطوری پرامیس با آجاکس ادغام میشه؟


میلاد-م
تخصص : توسعه‌دهنده رابط کاربری - Fron...
@milad 5 سال پیش مطرح شد
1

ببین، AJAX یک نوع خاصی از عملیات های ناهمگام بحساب میادش. وقتی این عملیات ناهمگام رخ میده می تونی به روش قدیمی با callback ها XMLHttpRequest interface برآوردش کنی یا به روش جدید با استفاده از promise همراه با fetch() interface.

به اینجا رجوع کن، مثال هم داره:
https://stackoverflow.com/questions/39751395/whats-the-difference-between-promise-and-ajax


میلاد-م
تخصص : توسعه‌دهنده رابط کاربری - Fron...
@milad 5 سال پیش مطرح شد
1

یعنی وقتی من با پرامیس(درست نوشتم یانه) کار میکنم درخواست اجاکس من ارسال میشه و جاوااسکریپت بقیه کدهارو پردازش میکنه و منتظر دستور من نمیمونه؟میشه مثالی برای من پیدا کنین چطوری پرامیس با آجاکس ادغام میشه؟

بله همین پِرامیس (معادل لغت promise به معنی قول، وعده).
موتور جاوااسکریپت منتظر دستور شما هستش، ولی در پس زمینه و پشت صحنه منتظر می مونه، در عین حال خطوط کد رو پیمایش می کنه و ادامه میده، اما در پشت صحنه یک صف داره تا درخواست های ناهمزمانی که برآورده میشن رو، بعدش اجرا کنه.


علیرضا
تخصص : فرانت اند وب
@sep28 5 سال پیش آپدیت شد
1

@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')
    })
})

نتیجه هم داد


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 5 سال پیش مطرح شد
3

Promise (مانند callbacks) به ما اجازه میده تا منتظر اجرای یک قطعه کد خاص بمونیم تا قطعه کد بعدی اجرا بشه.

در جاوااسکریپت Promise نشان دهنده نتیجه یک عملیات ناهمزمان است . Promise رو میشه به عنوان یک نگهدارنده تصور کرد. این نگهدارنده در واقع یک object است که میتونیم callbacks رو بهش پیوست کنیم.

Promiseها میتونن یکی از سه حالت زیر داشته باشند:

  • Pending : عملیات هنوز کامل نشده است.
  • Fulfilled : عملیات کامل شده و Promise دارای یک مقدار است.
  • Rejected  : عملیات انجام شده اما شکست خورده یا با مشکل روبرو شده است.

اما خارج از این تعاریف شما Promise رو می‌تونید دقیقا هم معنی خود کلمه در نظر بگیرید... یه قول..
(این داده در دسترس نیست اما هنگامی که بود، قول میدیم اون ره به شما ارجاع بدیم)

بعضی کار ها در برنامه نویسی تحت وب، نتیجه رو در لحظه به ما میده مثلا محاسبات و غیره ... اما بعضی کارها مثل دریافت اطلاعات از API زمان بر هستند (شما درخواست ارسال میکنی و بعد از مدت حدودا ۱ ثانیه جواب میگیری)
این وقفه مشکلی رو بوجود میاره و اون اینه که: اون لحظه (لحظه ارسال درخواست) ما دسترسی به داده ها نداریم چون هنوز زمان سپری نشده و پاسخ درخواست هنوز به ما نرسیده...

پس از یه Promise استفاده میکنیم و این Promise به ما این امکان رو میده که پس از تاخیر بوجود آمده یه Callback رو صدا بزنیم..
..


میلاد-م
تخصص : توسعه‌دهنده رابط کاربری - Fron...
@milad 5 سال پیش مطرح شد
0

@paressep28
به نظرم که درست میادش.

@ali.bayat
خیلی ممنون جناب بیات، توضیحات تون خیلی گویا بودش و لذت بردم از متن تون. توضیحاتی هم که در خصوص خود کلمه Promise به معنی قول دادید و دلیل نام گذاری رو هم بیان کردید خیلی جالب بودش.
اگر ممکنه چند خطی هم در خصوص بهبود promise ها با async/await بفرمایید.


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 5 سال پیش مطرح شد
1

@milad
درود..

برنامه نویسی ناهمگام (Asynchronous) یکی از خصوصیات پیش بینی شده جاوا اسکریپت است تا کار با توابع ناهمگام (غیرهمزمان ) را آسانتر و قابل درک تر سازد. اگر بخواهیم چنین خصوصیتی در جاوااسکریپت رو بررسی کنیم:

  • اولین نسخه از این توابع Callback ها بودند که در صورت زیاد شدن کد رو الکی شلوغ و غیر خوانا ميکنند
  • سپس Promise ها ارائه شدند
  • در حال حاظر Async/Await جدیدترین روش نوشتن کدهای غیرهمزمان در جاوااسکریپته

نکات زیر در مورد این توابع صدق میکنه:

  • غیرقابل انسداد هستند (درست شبیه Promise و Callback)
  • برای ساده سازی روند کار و نوشتن Promise های زنجیره ای طراحی شدند
  • توابع Async یک Promise رو برمیگردونن. اگر تابع یک خطا رو برمیگردونه،Promise رد شده و اگر تابع یک مقدار رو برمیگردونه Promise پذیرفته شده.

اما اگر دوباره بخواهیم خارج از تعاریف و مختصر بگیم:
هدف توابع async/await ساده‌سازی استفاده از Promise ها به صورت همزمان و اعمال یک سری رفتار روی Promise هاست..
همون‌طور که Promise ها، شبیه به Callback های ساختار یافته هستند.. async/await هم شبیه به ترکیب Promise ها و Generator هاست

ممکنه یه سوال هم ایجاد بشه که چرا باید از چنین قابلیتی استفاده کنیم؟ وقتی با Promise هم میشه اون کار رو انجام داد؟ و دلایلش هم به شرح زیره:

  • مدیریت بهتر خطاها
  • گزارش بهتر خطاها
  • اداره جملات شرطی به صورت یکپارچه
  • عملکرد با مقدار حافظه پایین تر
  • سینتکس بهتر
  • Method Chaining

پیروز باشید.


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام