دریافت کاربران از گیت هاب
یک تابع async به نام getUsers(names)بسازید که یک آرایه از نامهای ورود به سیستم گیت هاب دریافت کرده، کاربران را از گیت هاب بارگیری کند و یک آرایه از کاربران گیت هاب را برگرداند.
آدرس گیت هاب برای دریافت اطلاعات کاربران USERNAME به این صورت است: https://api.github.com/users/USERNAME.
در سندباکس (sandbox) یک مثال آزمایشی وجود دارد
موارد مهم:
- باید یک درخواست
fetchبرای هر کاربر وجود داشته باشد. - درخواستها باید منتظر یکدیگر نباشند تا دادهها به سرعت برسند.
- اگر هر درخواست موفق آمیز نباشد یا چنین کاربری وجود نداشته باشد،تابع باید مقدار
nullرا در آرایه نتیجه برگرداند.
برای دریافت کاربران به این موارد نیاز داریم: fetch('https://api.github.com/users/USERNAME').
اگر پاسخ دارای وضعیت 200 است،برای خواندن شی .json() را فراخوانی کنید.
در غیر اینصورت اگر fetch ناموفق بود یا پاسخ دارای وضعیت غیر 200 (200-299) بود در آرایه نتیجه null قرار میگیرد.
پس کد به اینصورت است:
async function getUsers(names) {
let jobs = [];
for(let name of names) {
let job = fetch(`https://api.github.com/users/${name}`).then(
successResponse => {
if (successResponse.status != 200) {
return null;
} else {
return successResponse.json();
}
},
failResponse => {
return null;
}
);
jobs.push(job);
}
let results = await Promise.all(jobs);
return results;
}
لطفا توجه کنید: فراخوانی .then به صورت مستقیم به fetch متصل شده است، بنابراین وقتی پاسخ را داریم، منتظر دیگر fetch ها نمیماند، بلکه به طور فوری شروع به خواندن .json() میکند.
اگر از await Promise.all(names.map(name => fetch(...))) استفاده کنیم و .json() را برروی نتایج فراخوانی کنیم، آنگاه باید منتظر بماند تا همه درخواستها پاسخ دهند. با اضافه کردن .json() به صورت مستقیم به هر fetch اطمینان حاصل میکنیم که هر کدام آنها به صورت جداگانه شروع به خواندن دادهها به صورت JSON میکند و منتظر یکدیگر نمیماند.
این مثال نشاندهنده این است که چگونه متدهای Promise در سطح پایین همچنان میتواند مفید باشد حتی اگر بیشتر از async/await استفاده شود.