[SOLVED]Problema di scope? non credo(Promise)

di il
4 risposte

[SOLVED]Problema di scope? non credo(Promise)

Salve, ho un problema con 2 array, nonostante vengano dichiarati credo in maniera giusta, quando cerco di recuperare i valori, risultano vuoti.Gli array da prendere in esame sono "articoliPiuConsumati" e "totQuantita", li dichiaro all' interno di setResHtml ma come già detto quando cerco di recuperare il loro valore all' interno di <script> tramite "JSON.stringify"essi risultano vuoti.
Grazie a chi risponderà dedicandomi il suo tempo prezioso.
const http = require('http');
var BlueBird = require('bluebird')
const mysql = require('mysql');
var Chart = require('chart.js');

const connection = mysql.createConnection({
  host: '127.0.0.1',
  user: 'andrea',
  password: 'password',
  database: 'spesa',
  charset: 'utf8'
});

//html string that will be send to browser
var template ="<html><head><title>Grafici Analisi Spesa</title><script src='https://cdnjs.cloudflare.com/ajax/libs/Chart.js/1.0.2/Chart.min.js'></script></head><body><h1>Grafici Analisi Spesa</h1>{${table}}</body></html>";

var sqlQueryArticoliPiuConsumati ='SELECT articolo,SUM(quantita)as quantita FROM registro GROUP BY articolo ORDER BY SUM(quantita) DESC LIMIT 0, 20';
var sqlQueryDoveSiSpendeDiPiu ='SELECT articolo,SUM(costo)as costo FROM registro GROUP BY articolo ORDER BY SUM(costo) DESC LIMIT 0, 20';

function setResHtml(sql1, sql2, cb){
   
	var table = '';
	
	var articoliPiuConsumati = new Array();
	var totQuantita = new Array();
	
	db  = BlueBird.promisifyAll(connection);
	db.queryAsync(sql1).then(function(rows){   
		for (let i = 0; i < rows.length; i++) {
    		articoliPiuConsumati.push(rows[i].articolo);
    		totQuantita.push(rows[i].quantita);
    		//console.log(articoliPiuConsumati[i] + " " + totQuantita[i]);
    	};
    	    	
	});
    	
	table = `<canvas id="piuConsumatiChart" width="600" height="400" ></canvas>`;
	table += `<script>
	console.log(${JSON.stringify(articoliPiuConsumati)});
	
	var barDataPiuConsumati = {
        labels : ${JSON.stringify(articoliPiuConsumati)},
        datasets : [
            
            {
                fillColor : "rgba(73,188,170,0.4)",
                strokeColor : "rgba(72,174,209,0.4)",
                data : ${JSON.stringify(totQuantita)}
            }
        ]
    }
    // get bar chart canvas
    var piuConsumatiChart = window.document.getElementById("piuConsumatiChart").getContext("2d");
    // draw bar chart
    new Chart(piuConsumatiChart).Bar(barDataPiuConsumati);
    </script>`;
	
/*
	table = `<canvas id="piuConsumatiChart" width="600" height="400" ></canvas>`;
	table += `<script>
	var barDataPiuConsumati = {
        labels : ['1', '2', '3', '4'],
        datasets : [
            
            {
                fillColor : "rgba(73,188,170,0.4)",
                strokeColor : "rgba(72,174,209,0.4)",
                data : [1, 2, 3, 4]
            }
        ]
    }
    // get bar chart canvas
    var piuConsumatiChart = window.document.getElementById("piuConsumatiChart").getContext("2d");
    // draw bar chart
    new Chart(piuConsumatiChart).Bar(barDataPiuConsumati);
    </script>`;
    */
	//console.log("table="+table);
	
	cb(table);
	
};

//create the server for browser access
//resql è il parametro che si passa alla funzione di callback nel nostro caso diventerà "table"
const server = http.createServer((req, res)=>{
  setResHtml(sqlQueryArticoliPiuConsumati, sqlQueryDoveSiSpendeDiPiu, resql=>{
    reo = template.replace('{${table}}', resql);
    res.writeHead(200, {'Content-Type':'text/html; charset=utf-8'});
    res.write(reo, 'utf-8');
    res.end();
  });
}).listen(8081);

4 Risposte

  • Re: [SOLVED]Problema di scope? non credo(Promise)

    Ciao, sto studiando da poco ES6 (è scritto in ES6 quello? bello complicato...),ho però visto un pò le promise in un progetto su PDF.

    Non è che la chiamata queryAsync va per i fatti suoi e il codice seguente (table = <canvas 'etc etc) senza che gli array siano valorizzati quando esegue quel codice? questi problemi di sincronizzazione mi fanno impazzire...anche con i PDF (uso PDF.js worker etc) usa le promise e il codice per essere sicuro che sia sincronizzato devo metterlo tipo in getPage() render() etc etc è lì che sono sicuro ad esempio che il PDF sia caricato, renderizzato etc etc

    Ciao,

    Davide
  • Re: [SOLVED]Problema di scope? non credo(Promise)

    Ciao Davide, grazie per la tua risposta.Non so quale sia la versione del codice, ho copiato si qua e di là e ho adattato alle mie esigenze, anche io studio da poco js.
    A proposito della promise mi stai suggerendo che probabilmente non funziona bene, non c' avevo proprio pensato...Sto cercando una soluzione per capire se funziona tramite log.
    Ho provato anche altre soluzioni oltre che BlueBird ma non hanno funzionato.
  • Re: [SOLVED]Problema di scope? non credo(Promise)

    OK ho risolto, in pratica la logica delle promise da quello che ho capito è: il codice che viene eseguito dopo la fine dellla funzione promise(chain) è quello incapsulato nel "then", quello fuori dal "then" se ne frega della promise.La mia soluzione è stato mettere table += etc etc all' interno del blocco "then", quindi la tua ipotesi era corretta.Grazie
  • Re: [SOLVED]Problema di scope? non credo(Promise)

    Ok! Bene

Devi accedere o registrarti per scrivere nel forum
4 risposte