راکت
حل شده

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

10 پاسخ

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

پاسخ‌ها

10
حسام موسوی
حسام موسوی
@hesammousavi

تخصص: طراح و برنامه نویس

بهترین پاسخ

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

let allData = await api.getAll();
محسن بستان
محسن بستان
@mohsenbostan

تخصص: Senior Backend Developer

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

حسام موسوی
حسام موسوی
@hesammousavi

تخصص: طراح و برنامه نویس

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

شاید پاسخ شما همین‌جا باشد

محسن بستان
محسن بستان
@mohsenbostan

تخصص: Senior Backend Developer

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

حسام موسوی
حسام موسوی
@hesammousavi

تخصص: طراح و برنامه نویس

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

محسن بستان
محسن بستان
@mohsenbostan

تخصص: Senior Backend Developer

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

محسن بستان
محسن بستان
@mohsenbostan

تخصص: Senior Backend Developer

@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;
    }
}
محسن بستان
محسن بستان
@mohsenbostan

تخصص: Senior Backend Developer

@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

تخصص: طراح و برنامه نویس

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

محسن بستان
محسن بستان
@mohsenbostan

تخصص: Senior Backend Developer

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

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