از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
تبدیل Callback APIها به Promises در Node.jsJavaScript، اگرچه فقط تک رشته ای است، اما یک زبان ناهمزمان است. در ابتدا فقط از callback برای کارهای ناهمزمان استفاده می کرد، اما ES6 مفهوم یک وعده را معرفی کرد که کار با این وظایف را بسیار آسان کرد. اما مشکل این است که بسیاری از کتابخانهها و APIهای اولیه از callback استفاده میکنند و…
سرفصلهای مطلب
معرفی
جاوا اسکریپت، اگرچه تنها تک رشته ای است، اما یک زبان ناهمزمان است. در ابتدا فقط از callback برای کارهای ناهمزمان استفاده می کرد، اما ES6 مفهوم یک وعده را معرفی کرد که کار با این وظایف را بسیار آسان کرد.
با این حال، مشکل این است که بسیاری از کتابخانهها و APIهای اولیه از callback استفاده میکنند، و همیشه راه سادهای برای تبدیل آنها به استفاده از وعدهها برای کار بهتر با بقیه کد شما وجود ندارد.
در این مقاله قصد داریم شما را در این زمینه راهنمایی کنیم process تبدیل یک Callback API موجود به وعده.
پاسخ به تماس در مقابل وعده ها
در جاوا اسکریپت، callback تابعی است که به عنوان آرگومان به تابع دیگری منتقل میشود، که سپس در داخل تابع خارجی برای تکمیل نوعی عمل فراخوانی میشود. در اینجا یک مثال ساده از پاسخ به تماس آورده شده است:
function greeting(name, callback) {
console.log('Hello ' + name);
callback();
}
greeting('John', function() {
console.log('The callback was invoked inside of `greeting()`!');
});
در این مثال، greeting
تابع یک نام و یک تابع فراخوانی را به عنوان پارامتر می گیرد. ابتدا یک پیام تبریک ثبت میکند و سپس عملکرد پاسخ به تماس را فراخوانی میکند.
وعده ها، روی از سوی دیگر، مقداری را نشان میدهد که ممکن است هنوز در دسترس نباشد، اما در مقطعی در آینده حل شود یا به طور کلی رد شود. عهد سه حالت دارد: معلق، وفا شده و رد شده. در اینجا یک وعده معادل برای مثال قبلی callback آورده شده است:
let greeting = new Promise(function(resolve, reject) {
let name = 'John';
console.log('Hello ' + name);
resolve();
});
greeting.then(function() {
console.log('The promise was fulfilled!');
});
در این مورد، greeting
وعده پیامی را ثبت می کند و سپس با آن تماس می گیرد resolve
تابع. را then
این روش برای برنامهریزی تماس پس از تحقق وعده استفاده میشود.
وعدهها به چند دلیل قویتر از تماسهای برگشتی هستند. آنها امکان کنترل بهتر بر جریان عملیات ناهمزمان را فراهم می کنند، مدیریت بهتر خطا را ارائه می دهند و به جلوگیری از جهنم بدنام پاسخ به تماس کمک می کنند.
در حالی که تماسهای برگشتی ساده و قابل درک هستند، وعدهها کنترل و انعطافپذیری بیشتری را هنگام برخورد با عملیات ناهمزمان فراهم میکنند. آنها همچنین کدهای شما را پاکتر و خواناتر میکنند، به همین دلیل است که بسیاری از توسعهدهندگان آنها را به callback ترجیح میدهند.
روش تبدیل Callbacks APIها به Promises
تبدیل یک callback API به وعده شامل قرار دادن تابع callback درون یک وعده است. بیایید نگاهی به یک مثال بیندازیم. فرض کنید یک تابع داریم getData
که از یک فراخوان برای مدیریت عملیات ناهمزمان استفاده می کند:
function getData(callback) {
// Simulate async operation
setTimeout(() => {
const data = 'Hello, world!';
callback(null, data);
}, 2000);
}
برای استفاده از این تابع، معمولاً یک تابع callback ارسال می کنیم تا نتیجه را کنترل کند:
getData((err, data) => {
if (err) {
console.error(err);
} else {
console.log(data); // Outputs: Hello, world!
}
});
برای تبدیل این به یک وعده، می توانیم یک تابع جدید ایجاد کنیم که یک وعده را برمی گرداند:
function getDataPromise() {
return new Promise((resolve, reject) => {
getData((err, data) => {
if (err) {
reject(err);
} else {
resolve(data);
}
});
});
}
در حال حاضر، ما می توانیم استفاده کنید then
و catch
روش های وعده برای رسیدگی به نتیجه:
getDataPromise()
.then(data => console.log(data)) // Outputs: Hello, world!
.catch(err => console.error(err));
اکنون خواندن و درک نسخه مبتنی بر وعده تابع بسیار آسانتر است، مخصوصاً زمانی که با چندین عملیات ناهمزمان سر و کار دارید.
با استفاده از کتابخانه Bluebird
Bluebird یک کتابخانه Promise با امکانات کامل برای جاوا اسکریپت است. این سبک وزن، قوی است و قادر به تبدیل APIهای مبتنی بر تماس موجود به APIهای مبتنی بر Promise است.
برای شروع استفاده از Bluebird، ابتدا آن را از طریق npm نصب کنید:
$ npm install bluebird
پس از نصب، می توانید یک API برگشت به تماس را با استفاده از آن به Promise تبدیل کنید Promise.promisifyAll()
تابع. این تابع یک شی را می گیرد و یک شی جدید را با همان متدها برمی گرداند، اما این متدها به جای گرفتن callback، Promises را برمی گرداند.
در اینجا یک مثال اساسی است:
const Promise = require('bluebird');
const fs = Promise.promisifyAll(require('fs'));
fs.readFileAsync("example.txt", "utf8").then(function(contents) {
console.log(contents);
}).catch(function(err) {
console.error(err);
});
در این کد، fs.readFileAsync
یک نسخه مبتنی بر وعده است fs.readFile
. وقتی با آن تماس میگیرید، یک Promise برمیگرداند که با محتوای فایل محقق میشود.
توجه داشته باشید: ممکن است متوجه شوید که تمام روش های ناهمزمان در fs
ماژول اکنون به پایان می رسد Async
. این یک قرارداد نامگذاری است که توسط Bluebird برای متمایز کردن روش های مبتنی بر Promise از همتایان مبتنی بر تماس آنها استفاده می شود.
تبدیل تماس های تو در تو به Promises
رسیدگی به تماس های تودرتو می تواند واقعاً دشوار باشد. آنها می توانند کد شما را برای خواندن و درک سخت کنند. خوشبختانه، Promises می تواند به صاف کردن کد شما و قابل مدیریت کردن آن کمک کند.
بیایید سناریوی تماس تودرتو زیر را در نظر بگیریم:
getData('data.json', function(err, data) {
if (err) {
console.error(err);
} else {
parseData(data, function(err, parsedData) {
if (err) {
console.error(err);
} else {
saveData('parsedData.json', parsedData, function(err) {
if (err) {
console.error(err);
} else {
console.log('Data saved successfully');
}
});
}
});
}
});
کد بالا یک نمونه کلاسیک از جهنم برگشت تماس است. خواندن آن سخت و مستعد خطا است. حالا بیایید با استفاده از Bluebird این را به Promises تبدیل کنیم:
const Promise = require('bluebird');
const getDataAsync = Promise.promisify(getData);
const parseDataAsync = Promise.promisify(parseData);
const saveDataAsync = Promise.promisify(saveData);
getDataAsync('data.json')
.then(parseDataAsync)
.then(saveDataAsync)
.then(() => console.log('Data saved successfully'))
.catch(console.error);
همانطور که می بینید، خواندن و درک نسخه مبتنی بر Promise بسیار ساده تر است. همچنین قویتر است، زیرا هر خطایی که در هر مرحله رخ دهد توسط سینگل شناسایی میشود .catch()
در پایان.
نتیجه
در این مقاله، روش تبدیل Callback APIهای موجود به وعده در Node.js را بررسی کرده ایم. ما تفاوتهای بین تماسهای برگشتی و وعدهها و اینکه چرا تبدیل تماسهای برگشتی به وعدهها میتواند مفید باشد را بررسی کردهایم. ما روش انجام این تبدیل را بررسی کردهایم و چگونه کتابخانه Bluebird میتواند به سادهسازی آن کمک کند process. ما همچنین درباره روش رسیدگی به تماس های تودرتو و تبدیل آنها به وعده ها بحث کردیم.
را process تبدیل تماسهای برگشتی به وعدهها میتواند کمی مشکل باشد، بهویژه زمانی که با تماسهای تودرتو سروکار داریم. اما با تمرین و کمک کتابخانه هایی مانند Bluebird، می توانید این کار را ساده کنید process و پایگاه کد خود را بهبود بخشید.
(برچسبها برای ترجمه)# جاوا اسکریپت
منتشر شده در 1402-12-29 14:06:04