Передача функции разрешения в XMLHttpRequest не работает - PullRequest
0 голосов
/ 05 апреля 2019

Я пишу класс для выполнения асинхронных HTTP-запросов в JSON ReST API.

Следующий код работает как задумано:

/*
    A JSON API requestor.
*/
JSONHttpRequest = class extends XMLHttpRequest {
    constructor (withCredentials = true) {
        super();
        this.withCredentials = withCredentials;
    }

    get json () {
        const json = {
            response: this.response,
            status: this.status,
            statusText: this.statusText
        };

        try {
            json.json = JSON.parse(this.response);
        } catch (error) {
            return json;
        }

        return json;
    }

    setRequestHeaders (headers) {
        for (const header in headers) {
            this.setRequestHeader(header, headers[header]);
        }
    }
};


/*
    Makes an asychronous JSON API reguest.
*/
request = function (method, url, data = null, headers = {}) {
    function executor (resolve, reject) {
        const jhr = new JSONHttpRequest();
        jhr.open(method, url);
        jhr.setRequestHeaders(headers);

        jhr.onload = function () {
            if (this.status >= 200 && this.status < 300) {
                resolve(this.json);
            } else {
                reject(this.json);
            }
        };

        jhr.onerror = function () {
            reject(this.json);
        };

        if (data == null) {
            jhr.send();
        } else {
            jhr.send(data);
        }
    }

    return new Promise(executor);
};

Теперь я хотел бы напрямую определить onload и onerror для класса:

/*
    A JSON API requestor.
*/
JSONHttpRequest = class extends XMLHttpRequest {
    constructor (resolve, reject, withCredentials = true) {
        super();
        this.resolve = resolve;
        this.reject = reject;
        this.withCredentials = withCredentials;
    }

    get json () {
        const json = {
            response: this.response,
            status: this.status,
            statusText: this.statusText
        };

        try {
            json.json = JSON.parse(this.response);
        } catch (error) {
            return json;
        }

        return json;
    }

    setRequestHeaders (headers) {
        for (const header in headers) {
            this.setRequestHeader(header, headers[header]);
        }
    }

    onload () {
        if (this.status >= 200 && this.status < 300) {
            this.resolve(this.json);
        } else {
            this.reject(this.json);
        }
    };

    onerror () {
        this.reject(this.json);
    };
};


/*
    Makes an asychronous JSON API reguest.
*/
request = function (method, url, data = null, headers = {}) {
    function executor (resolve, reject) {
        const jhr = new JSONHttpRequest(resolve, reject);
        jhr.open(method, url);
        jhr.setRequestHeaders(headers);

        if (data == null) {
            jhr.send();
        } else {
            jhr.send(data);
        }
    }

    return new Promise(executor);
};

Однако теперь функции resolve и reject никогда не будут вызываться.Что мне здесь не хватает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...