Я пишу класс для выполнения асинхронных 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
никогда не будут вызываться.Что мне здесь не хватает?