используя асинхронное ожидание в классе для назначения свойств, но возвращает ноль - PullRequest
3 голосов
/ 03 июня 2019

У меня есть класс с _code, установленным на null с самого начала, затем делающим запрос к url, чтобы получить результат.

Каким-то образом я после присвоения кода свойства класса с результатом все еще дает мне ноль.

Что я с этим не так делаю?

class R {
    constructor() {
        this._code = null;
    }

    get code() {
        return this._code;
    }

    set code(value) {
        this._code = value;
    }

    async makingRequests(id) {
        await this.requestToGetCode(id);
        // this gives me null
        console.log(this.code, 'this.code in rquest');
    }

    async requestToGetCode(id) {
        await request(url, async (error, response, body) => {
            if (body !== 'found_no_results') {
                switch (response.statusCode) {
                    case 200:
                        this.code = await JSON.parse(body);
                        // this does give me the proper result though
                        console.log(this.code, 'this.code in requestToGetCode');
                        break;
                    case 404:
                        console.log('page not found');
                        break;
                    default:
                        break;
                }
            } else {
                console.log(body, id);
            }
        });
    }
}

Заранее благодарим за любую помощь и предложения.

1 Ответ

1 голос
/ 04 июня 2019

Как уже упоминалось в комментариях, библиотека запросов не возвращает обещание, а вместо этого работает с обратным вызовом.Вы можете использовать такую ​​библиотеку, как request-обещание , чтобы обойти это.Однако, если вы не хотите делать это по какой-то причине, этот ответ может вам помочь.

Чтобы использовать async / await с библиотекой запросов, вам нужно вручную обернуть вызов в Promise.

async requestToGetCode(id) {
    await new Promise((resolve, reject) => {
        request(url, (error, response, body) => {
            if (body !== 'found_no_results') {
                switch (response.statusCode) {
                    case 200:
                        this.code = JSON.parse(body);
                        // this does give me the proper result though
                        console.log(this.code, 'this.code in requestToGetCode');
                        resolve();
                        break;
                    case 404:
                        console.log('page not found');
                        reject('Not found');
                        break;
                    default:
                        // Reject all other cases
                        reject('Error');
                        break;
                }
            } else {
                // Reject as we do not receive the correct response
                console.log(body, id);
                reject('Error');
            }
        });
    });
}

По сути, мы создаем здесь новое Обещание, которое выполнит запрос за нас.В ответ на запрос мы затем вызываем resolve или reject в зависимости от результата.

...