[FRAGE] Asynchrone Werteübergabe

relei2004

New member
Hallo,

ich bin neu in der Javascript Welt und werde verrückt mit der Asynchronität.

Wäre super wenn ihr mir helfen könntet.

Der Problem Code:
Code:
db_actions.prototype.get_changes = function (params) {
    
    let row_count = 0;
    let param = [];

    return new Promise((resolve, reject) => {
        let res_str = `{"daten":[`;

        let q = `select * from client_import where user_id = "${params.user}" and client_id <> "${params.cid}" and tab = "${params.table}"`;

        this.db.serialize(()=>{
            this.db.each(q, [], (err, row) => {
                if (err !== null) {
                    console.log("Error ", err);
                    return "";
                }

                param.push(params);

                param[param.length - 1].imp_id = row.cimp_id;
                param[param.length - 1].keyfield1 = row.keyfield1;
                param[param.length - 1].keyfield2 = row.keyfield2;
                param[param.length - 1].value1 = row.value1;
                param[param.length - 1].value2 = row.value2;
                param[param.length - 1].action = row.action;
                param[param.length - 1].aedatfield = row.aedatfield;

                //this.db.serialize(()=>{
                
                    this.set_export(param[param.length - 1]).then((r)=>{
                        //param.exp_id = r;

                        console.log("0value:", r.value1);
                        console.log("0expID: ", r.exp_id);

                        //res_str = res_str + this.table_select(param);
                        this.table_select(r).then((r) =>{
                            res_str = res_str + r;
                            row_count = row_count - 1;

                            if (row_count === 0){
                                res_str = res_str.substr(0, res_str.length - 1);
                                res_str = res_str + "]}";
                                resolve(res_str);
                            }

                        })

                    });
                //})   
            }, (err, count) => {
                row_count = count;
               /* res_str = res_str.substr(0, res_str.length - 1);
                res_str = res_str + "]}";
                resolve(res_str);*/
            })
        })  

    })

}

db_actions.prototype.set_export = function(param){

    return new Promise((resolve, reject) => {
        this.db.serialize(()=>{
            let q = `select * from client_export where user_id = "${param.user}" and cid = "${param.cid}" and cimp_id = "${param.imp_id}" and status <> "closed"`;
            console.log("Q: ", q);
            console.log("In P value:", param.value1);
            console.log("In P expID: ", param.exp_id);

            this.db.all(q, (err, rows_ce) => {
                if (err !== null) {
                    console.log("Error ", err);
                    return;
                }

                if (rows_ce.length === 0) { 
                    param.exp_id = "0";       
                } else {
                    param.exp_id = rows_ce[0].cexp_id.toString();  
                }

                console.log("Param: ", param);
                this.write_export(param);
                resolve(param);
            })  
        })
    })
}

Es geht um die Übergabe von param. Die Funktion set_export wird wiederholt aufgerufen und ich bekommen in der Funktion bis zum Aufruf von this.db.all auch die richtigen Werte aber in der Funktion this.db.all steht im Parameter param immer der letzten Wert der Schleife.

Ich habe ein Bind versucht und ein Object.create nichts hilft, ich habe irgendwie ein Verständnisproblem.

Könnt ihr mir da helfen?

Besten Dank und Gruß
Rene
 
Zuletzt bearbeitet von einem Moderator:
Du hast mehr ein Logikproblem als eines mit der Asynchronität. Der param Parameter bei set_export ist immer das gleiche Objekt wie params von get_export. Du musst in der "Schliefe" für jede Zeile ein neues Objekt erstellen - schau' dir das param-Array in set_export am Ende an - da sind überall die gleichen Daten drin.
 
Zurück
Oben