برنامه نویسی
هنوز با وعده های جاوا اسکریپت مبارزه می کنید؟

آیا به طور مداوم از API ها استفاده می کنید و هنوز با وعده های جاوا اسکریپت مبارزه می کنید؟ راه حل شما اینجاست!
بررسی اجمالی
- در این مقاله با متدهای Promises در جاوا اسکریپت و تفاوت های آنها بیشتر آشنا خواهید شد.
- این مقاله برای کسانی است که قبلاً جاوا اسکریپت را می دانند و می خواهند دانش خود را در مورد وعده های جاوا اسکریپت بهبود بخشند.
فهرست مطالب
شی جاوا اسکریپت Promise چیست؟
- یک شی که نشان دهنده تکمیل یا شکست نهایی یک عملیات ناهمزمان است.
- به عنوان مثال: درخواست API مخازن GitHub از شخصی.
- این برای جلوگیری از جهنم برگشت به تماس و آسانتر کردن نحوه مدیریت ناهمزمان در کد جاوا اسکریپت ایجاد شده است.
- یک شیء وعده دارای یکی از این سه حالت است:
- در انتظار: حالت اولیه
- حل شد: عملیات با موفقیت اجرا شد
- رد شد: عملیات انجام نشد
- در زیر یک مثال ساده از یک Promise در JS وجود دارد:
const myPromise = new Promise((resolve, reject) => {
// Asynchronous task:
setTimeout(() => {
resolve("Promise resolved after 1 second");
}, 1000);
});
// using .then(), .catch(), and .finally()
myPromise
.then((successValue) => console.log(successValue)) // .then to handle success
.catch((error) => console.error(error)); // .catch to handle error
.finally(() => console.log('Process completed')); // Handle both success and error cases
// using try/catch and async/await
try {
const successValue = await myPromise; // your code will be here until the process ends
console.log(successValue);
} catch (error) {
console.error(error);
} finally {
console.log('Process completed.'); // This will run regardless of success or error
}
Promise Chaining در مقابل Promise Nesting؟
-
زنجیر زدن وعده: مدیریت چندین عملیات ناهمزمان که در آن هر کدام
.then()
متد یک Promise جدید برمیگرداند و به بعدی اجازه میدهد.then()
تماس گرفته شود و کد شما بیشتر شود قابل خواندن.
function fetchUser(userId) {} // it returns a promise
function fetchPosts(userId) {} // it returns a promise
function fetchComments(postId) {} // it returns a promise
// Start the promise chain
fetchUser(1)
.then((user) => {
console.log("User:", user);
return fetchPosts(user.id); // Return the next promise
})
.then((posts) => {
console.log("Posts:", posts);
return fetchComments(posts[0].id); // Return the next promise
})
.then((comments) => {
console.log("Comments:", comments);
})
.catch((error) => {
console.error("Error:", error);
});
-
وعده لانه سازی: قرار دادن یک وعده در وعده دیگری
.then()
روش. این می تواند منجر به کدهای تورفتگی بیشتر شود و می تواند آن را ایجاد کند خواندن سخت تر، به ویژه هنگامی که با چندین عملیات ناهمزمان سر و کار دارید.
function fetchUser(userId) {} // it returns a promise
function fetchPosts(userId) {} // it returns a promise
function fetchComments(postId) {} // it returns a promise
// Start the promise nesting
fetchUser(1)
.then((user) => {
console.log("User:", user);
return fetchPosts(user.id).then((posts) => {
console.log("Posts:", posts);
return fetchComments(posts[0].id).then((comments) => {
console.log("Comments:", comments);
});
});
})
.catch((error) => {
console.error("Error:", error);
});
روشهای وعده – .all، .allSettled، .race، و .any
-
Promise.all()
- MDN Web Docs: “روش استاتیک Promise.all() یک تکرار از وعده ها را به عنوان ورودی می گیرد و یک Promise را برمی گرداند. این وعده برگشتی زمانی محقق می شود که همه وعده های ورودی محقق شوند (از جمله زمانی که یک تکرار خالی ارسال می شود)، با یک آرایه. از ارزش های تحقق وقتی هر یک از وعده های ورودی رد می شود، با این دلیل اول رد، رد می کند.“
- این عبارت برجسته یکی از مهم ترین جنبه هایی است که باید در هنگام استفاده از Promise.all() در نظر گرفت.
const promise1 = Promise.resolve(3);
const promise2 = 42;
const promise3 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, "foo");
});
Promise.all([promise1, promise2, promise3]).then((values) => {
console.log(values);
});
// Expected output: Array [3, 42, "foo"]
-
Promise.allSettled()
- MDN Web Docs: “روش استاتیک Promise.allSettled() یک عدد از وعدهها را به عنوان ورودی دریافت میکند و یک Promise را برمیگرداند. این وعده بازگشتی زمانی محقق میشود که تمام وعدههای ورودی حل شود (از جمله زمانی که یک تکرار خالی ارسال شود)، با آرایه ای از اشیاء که نتیجه هر وعده را توصیف می کند.“
- هنگامی که شما نیاز دارید هر یک از وعده های خود را به طور مستقل مدیریت کنید، موارد موفقیت و خطاها را به صورت جداگانه برای هر وعده در داخل Promise.allSettled() مدیریت کنید، این کار مفیدترین جنبه را برجسته می کند.
const promise1 = Promise.resolve(3);
const promise2 = new Promise((resolve, reject) =>
setTimeout(reject, 100, "foo")
);
const promises = [promise1, promise2];
Promise.allSettled(promises).then((results) =>
results.forEach((result) => console.log(result.status))
);
// Expected output:
// "fulfilled"
// "rejected"
-
Promise.race()
- هنگامی که اولین وعده حل شد، (خطا یا موفقیت) برمی گردد.
- تصور کنید منتظر پاسخ از چندین سرور هستید. شما از Promise.race برای دریافت پاسخ از سروری که سریعترین پاسخ را میدهد استفاده میکنید.
const promise1 = new Promise((resolve, reject) => {
setTimeout(resolve, 500, "one");
});
const promise2 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, "two");
});
Promise.race([promise1, promise2]).then((value) => {
console.log(value);
// Both resolve, but promise2 is faster
});
// Expected output: "two"
-
Promise.any()
- وقتی اولین وعده حل شد (موفقیت) برمی گردد. اگر همه وعده ها شکست خورد، به نتیجه رسید
.catch()
. - شما در حال واکشی داده ها از چندین API هستید، اما به داده های اولین API که با موفقیت پاسخ می دهد علاقه مند هستید. برای مدیریت این سناریو از Promise.any استفاده می کنید.
- وقتی اولین وعده حل شد (موفقیت) برمی گردد. اگر همه وعده ها شکست خورد، به نتیجه رسید
const fetchFromAPI1 = fetch("https://api.example.com/endpoint1");
const fetchFromAPI2 = fetch("https://api.example.com/endpoint2");
const fetchFromAPI3 = fetch("https://api.example.com/endpoint3");
Promise.any([fetchFromAPI1, fetchFromAPI2, fetchFromAPI3])
.then((response) => response.json())
.then((data) => {
console.log("Received data from the first successful API call:", data);
})
.catch((error) => {
console.error("All API calls failed:", error);
});
منابع
با تشکر برای خواندن!
- در صورت داشتن هرگونه سوال، بازخورد یا پیشنهاد می توانید با ما تماس بگیرید. مشارکت شما قابل قدردانی است!
مخاطب
- می توانید این مطالب و مطالب دیگر را در: