await
, но у меня на верхнем уровне вложенности прикручен слушатель событий.'await' has no effect on the type of this expression.
, либо что переменная this.data.date
не определена.class Charts {
constructor(csrfToken, data = null) {
this.csrfToken = csrfToken;
this.data = data;
}
createChart(xData, yData, legend, typeOfChart) {
const context = document.querySelector('#report').getContext('2d');
return new Chart (context, {
type: typeOfChart,
data: {
labels: xData,
datasets: [{
label: legend,
data: yData
}]
}
});
}
async requestToServer ( { url, transaction, newItem, subNewItem, date, type} ) {
let response = await fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json;charset=utf-8',
'X-CSRF-TOKEN': this.csrfToken
},
body: JSON.stringify({
"transaction": transaction, "newItem": newItem, "subNewItem": subNewItem, "date": date, "type": type
})
});
if (response.ok) this.data = await response.json();
}
sendData() {
const btn = document.forms[0]['generate'];
...
btn.addEventListener('click', async () => {
await this.requestToServer(
{ url: url, date: [result[1], result[2]], transaction: result[3], newItem: result[4],
subNewItem: result[5], type: result[0]
}
);
...
window.location.href = "http://example.com/chart";
});
this.createChart(
this.data.date, this.data.sum, 'bla-bla-bla', this.data.type
);
}
}
this.createChart.addEventListener('click', async function() {
await this.requestToServer(
{ url: url, date: [result[1], result[2]], transaction: result[3], newItem: result[4],
subNewItem: result[5], type: result[0]
}
);
window.location.href = "http://example.com/chart";
}.bind(this));
this.createChart(
this.data.date, this.data.sum, 'bla-bla-bla', this.data.type
);
this.data.date
this.requestToServer
, а так контекст был бы на элементе, ссылку я скинул там всё подробно описано, я бы не смог расписать так подробно как написано там в ответе на stackoverflow this
для вызова this.requestToServer
- это я понял, но слушатель мы прикручиваем не на клик по кнопке createChart
, а на методthis.createChart
- вот это мне не понятно в методе sendData интерпретатор не дожидаясь выполнения метода requestToServer
requestToServer
.createChart
createChart(xData, yData, legend, typeOfChart) {
const context = document.querySelector('#report').getContext('2d');
const chart = Chart (context, {
type: typeOfChart,
data: {
labels: xData,
datasets: [{
label: legend,
data: yData
}]
}
});
chart.addEventListener('click', async () => {
await this.requestToServer(
{ url: url, date: [result[1], result[2]], transaction: result[3], newItem: result[4],
subNewItem: result[5], type: result[0]
}
);
});
return chart;
}
createChart.addEventListener('click', async () => {
await this.requestToServer(
{ url: url, date: [result[1], result[2]], transaction: result[3], newItem: result[4],
subNewItem: result[5], type: result[0]
}
);
createChart
это кнопка. Здесь сомнений быть не может))this.createChart
выполнялся не дожидаясь выполнения колбека обработчика событий А как хотя бы в теории можно дождаться респонса, если вызова в принципе не существует до клика?
const event = (el, type) => new Promise(reslove => el.addEventListener(type, reslove, { once: true }));
await event(createChart, 'click');
await request(...)
sendData() {
const btn = document.forms[0]['generate'];
...
btn.addEventListener('click', async () => {
await this.requestToServer(
{ url: url, date: [result[1], result[2]], transaction: result[3], newItem: result[4],
subNewItem: result[5], type: result[0]
}
);
...
window.location.href = "http://example.com/chart";
this.createChart(
this.data.date, this.data.sum, 'bla-bla-bla', this.data.type
);
});
}
window.location.href = "http://example.com/chart";
) - твоего js кода нет. Вообще нет. Это другая страница с другим кодом. Не имеет совершенно никакого значения что ты пытаешься делаешь в коде после того изменил адрес - этот код уже всё, остался в прошлом. class Charts {
constructor(csrfToken, data = null) {
this.csrfToken = csrfToken;
this.data = data;
}
createChart(xData, yData, legend, typeOfChart) {
const context = document.querySelector('#report').getContext('2d'),
chart = new Chart (context, {
type: typeOfChart,
data: {
labels: xData,
datasets: [{
label: legend,
data: yData
}]
}
});
return chart;
}
requestToServer ( { url, transaction, newItem, subNewItem, date, type } ) {
return new Promise((resolve, reject) => {
fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json;charset=utf-8',
'X-CSRF-TOKEN': this.csrfToken
},
body: JSON.stringify({
"transaction": transaction, "newItem": newItem, "subNewItem": subNewItem, "date": date, "type": type
})
}).then((response)=> {
resolve(responce);
}).catch((err) => {
reject(err);
})
});
}
sendData() {
const btn = document.forms[0]['generate'],
_this = this;
return new Promise((resolve, reject) => {
// Зачем это здесь???
btn.addEventListener('click', () => {
_this.requestToServer(
{
url: url,
date: [
result[1],
result[2]
],
transaction: result[3],
newItem: result[4],
subNewItem: result[5],
type: result[0]
}
).then((res) => {
resolve(res);
}).catch((err){
reject(err);
});
});
// Откуда это и зачем - не знаем.
// И должно быть не здесь
/**
this.createChart(
this.data.date, this.data.sum, 'bla-bla-bla', this.data.type
);
*/
})
}
}
const test = new Charts(csrfToken, data);
// Цепочку выполнени строите сами
test.sendData().then((res) => {
console.log(res);
});
btn
, на которую я прикрутил обработчик, получает график. Мне показалось, что внедрить этот код вместе будет разумно)sendData() {
const btn = document.forms[0]['generate'];
...
btn.addEventListener('click', async () => {
await this.requestToServer(
{ url: url, date: [result[1], result[2]], transaction: result[3], newItem: result[4],
subNewItem: result[5], type: result[0]
}
);
...
window.location.href = "http://example.com/chart";
this.createChart(
this.data.date, this.data.sum, 'bla-bla-bla', this.data.type
);
});
}
element.setAttribute()
для формы установить display: none
, а для контейнера графика display: block