محسن بستان
5 سال پیش توسط محسن بستان مطرح شد
10 پاسخ

عدم پاسخ گویی axios در یک کلاس

سلام به همگی.
دوستان بنده در حال توسعه یک پکیج نود برای یک 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);

ثبت پرسش جدید
حسام موسوی
تخصص : طراح و برنامه نویس
@hesammousavi 5 سال پیش مطرح شد
1

از این حالت اینجا استفاده کردید در خارج از کد هم باید از await استفاده کنید.
یعنی برای مثال این شکلی

let allData = await api.getAll();

محسن بستان
تخصص : Senior Backend Developer
@mohsenbostan 5 سال پیش مطرح شد
1

@ali.bayat @hesammousavi @milad
تاپیک داشت پایین، میرفت تگ کردم!
شما نظری ندارید بزرگواران ؟


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

احتمالا شما فراموش کرددید که جاوااسکریپت کدهاش به شکل 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 هم بهره برد


محسن بستان
تخصص : Senior Backend Developer
@mohsenbostan 5 سال پیش مطرح شد
0

@hesammousavi
چون دارم یه ماژول می نویسم نمیتونم عملیات رو به اون صورت انجام بدم! آیا راهی هست که مستقیم در متد دیتا رو ریترن کنم ؟


حسام موسوی
تخصص : طراح و برنامه نویس
@hesammousavi 5 سال پیش مطرح شد
0

خیر راهی نیست .
جاوااسکریپت همیشه non-blocking کدها اجرا میشه.
شما یا از این promise ها باید استفاده کنید یا از callback یا از async و await بهره ببرید به غیر این راحی نیست


محسن بستان
تخصص : Senior Backend Developer
@mohsenbostan 5 سال پیش مطرح شد
0

@hesammousavi
از async هم استفاده کردم جواب نداد :|


محسن بستان
تخصص : Senior Backend Developer
@mohsenbostan 5 سال پیش مطرح شد
0

@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;
    }
}

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

از این حالت اینجا استفاده کردید در خارج از کد هم باید از await استفاده کنید.
یعنی برای مثال این شکلی

let allData = await api.getAll();

محسن بستان
تخصص : Senior Backend Developer
@mohsenbostan 5 سال پیش آپدیت شد
0

@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", {});
        })
    }
}

حسام موسوی
تخصص : طراح و برنامه نویس
@hesammousavi 5 سال پیش مطرح شد
0

نمیشه قربونت در جای اصلی باید از await استفاده بشه یا promise نمیدونم چرا در مقابل پذیرش این مسئله مقاومت میکنید .
روش کار js و اجرای کدهاش به شکل async هست !


محسن بستان
تخصص : Senior Backend Developer
@mohsenbostan 5 سال پیش مطرح شد

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

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