سلام به همگی.
دوستان بنده در حال توسعه یک پکیج نود برای یک API هستم.
مشکلی که هست اینه که وقتی از axios یا حتی fetch داخل متد های کلاس استفاده میکنم، undefined بر میگردونه.
کد به صورت زیر هستش :
const axios = require('axios');
class MyAPI {
constructor(access_token) {
this.__access_token = access_token;
}
getAll() {
axios.get("https://example.com/api", {
headers: {
'Authorization': this.__access_token
}
}).then((res) => {
return res.data;
}).catch(error => {
return error;
});
}
}
let api = new MyAPI("L8VFyeMzDyOLW0DUa");
let allData = api.getAll();
console.log(allData);
از این حالت اینجا استفاده کردید در خارج از کد هم باید از await استفاده کنید.
یعنی برای مثال این شکلی
let allData = await api.getAll();
@ali.bayat @hesammousavi @milad
تاپیک داشت پایین، میرفت تگ کردم!
شما نظری ندارید بزرگواران ؟
احتمالا شما فراموش کرددید که جاوااسکریپت کدهاش به شکل non-blocking یا همون async اجرا میشه
حالت زیر درست هست نه چیزی که نوشتید.
const axios = require('axios');
class MyAPI {
constructor(access_token) {
this.__access_token = access_token;
}
getAll() {
return axios.get("https://example.com/api", {
headers: {
'Authorization': this.__access_token
}
});
}
}
let api = new MyAPI("L8VFyeMzDyOLW0DUa");
let allData = api.getAll();
allData.then((res) => {
console.log(res.data);
}).catch(error => {
return error;
});
البته میشه از async/await هم بهره برد
@hesammousavi
چون دارم یه ماژول می نویسم نمیتونم عملیات رو به اون صورت انجام بدم! آیا راهی هست که مستقیم در متد دیتا رو ریترن کنم ؟
خیر راهی نیست .
جاوااسکریپت همیشه non-blocking کدها اجرا میشه.
شما یا از این promise ها باید استفاده کنید یا از callback یا از async و await بهره ببرید به غیر این راحی نیست
@hesammousavi
از کد زیر استفاده کردم و جواب نداد :
async getAll() {
try {
let res = await axios.get("https://example.com/api", {
headers: {
'Authorization': this.__access_token
}
})
return res.data;
}
catch(error) {
return error;
}
}
از این حالت اینجا استفاده کردید در خارج از کد هم باید از await استفاده کنید.
یعنی برای مثال این شکلی
let allData = await api.getAll();
@hesammousavi
دوباره به مشکل خوردم :)
من یک فکری به ذهنم رسید. اومدم یک کلاس جدا ساختم برای ریکوست و یکی هم برای کار اصلیم. اما باز هم جواب نمیده :
const axios = require('axios');
class Request {
constructor() {}
async request(reqpath, data) {
try {
let res = await axios.post(`https://example.com/api/${reqpath}`, {
headers: {
'Authorization': this.__access_token
},
data
})
return res.data;
}
catch(error) {
return error;
}
}
}
class MyAPI {
constructor(access_token) {
super();
this.__access_token = access_token;
}
getAll() {
(async () => {
return await this.request("/test", {});
})
}
}
نمیشه قربونت در جای اصلی باید از await استفاده بشه یا promise نمیدونم چرا در مقابل پذیرش این مسئله مقاومت میکنید .
روش کار js و اجرای کدهاش به شکل async هست !
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟