Невозможно вызвать функцию в Javascript - Диаграмма. js - PullRequest
0 голосов
/ 05 января 2020

Я разрабатываю приложение с electron и chart.js. Я подключил кнопку удаления, расположенную в HTML файле. Когда я нажимаю кнопку, информация удаляется в моем sqlite3 дБ, как шарм. Затем я нажимаю вторую кнопку, чтобы обновить sh мой график. Снова это работает как ожидалось. Я пришел с идеей вызова функции refre sh из функции удаления, но моя диаграмма остается неизменной.

let myLabel = [];
let myValues = [];

function delData() {
    var data_firstName = document.getElementById('firstName').value;

    const sqlite3 = require('sqlite3').verbose();
    let db = new sqlite3.Database('./data.db');
    db.run(`DELETE FROM Info WHERE firstName = '${data_firstName}';`, function(err, row) {});
    db.close();
    refreshData();
}

function refreshData() {
    myLabel = [];
    myValues = [];

    const sqlite3 = require('sqlite3').verbose();
    let db = new sqlite3.Database('./data.db');
    db.each('SELECT firstName, age FROM Info;', function(err, row) {
        myLabel.push(row.firstName);
        myValues.push(row.age);
    });
    db.close();
    popChart(myLabel, myValues);
}

function popChart (myLabel, myValues) {

    if (typeof testChart !== 'undefined') {
        testChart.destroy();
    }

    let myChart = document.getElementById('myChart').getContext('2d');

    testChart = new Chart(myChart, {
        type: 'bar',
        data: {
            labels: myLabel,
            datasets: [{
                label: 'Age',
                data: myValues,
                backgroundColor: 'rgba(84, 103, 180, 0.69)'
            }]
        },
        options: {}
    });
}

1 Ответ

1 голос
/ 05 января 2020

Ваша функция delData не ожидает удаления элемента из базы данных перед вызовом функции refreshData, используйте:

function delData() {
  var data_firstName = document.getElementById('firstName').value;

  const sqlite3 = require('sqlite3').verbose();
  let db = new sqlite3.Database('./data.db');
  db.run(`DELETE FROM Info WHERE firstName = '${data_firstName}';`, function(err, row) {
    db.close();
    refreshData();
  });
}

, поэтому refre sh будет запущен после удаления.

Вы можете достичь тех же результатов, используя ES6 async / await:

async function delData() {
  var data_firstName = document.getElementById('firstName').value;

  const sqlite3 = require('sqlite3').verbose();
  let db = new sqlite3.Database('./data.db');
  await db.run(`DELETE FROM Info WHERE firstName = '${data_firstName}';`);
  db.close();
  refreshData();
}

Это будет ждать завершения команды db, а затем продолжить выполнение.

...