WoLF_MaN
@WoLF_MaN
NodeJS, JS developer

NodeJS,Node-MySQL, Как вернуть значения из коллбэка в внешнюю функцию?

Имеются функции getUserProjects в которой используется getProjectsSheets -

Нужно в цикле вернуть смерженые значения.
Столько времени убил. Подскажите пожалуйста.

Может какие-то куски кода с использованием Promise .

getUserProjects:function(id, callback){
        var self = this,
            mysql = self.mysql,
            db = self.db,
            qr = "SELECT id, project_name, elem_markids FROM projects WHERE user_id = ? and showstatus = 0",
            arr = [id];


        db.query(qr,arr,function(err, result){
            if(err){
                console.log("Can't make request: " + err);
                callback("query_error",undefined); //Сразу смотреть в логи.
            }
/* С этого места */
          var res = [];

                for(var i=0;result.length > i;i++){
                    var rs = result[i];
                    self.getProjectsSheets(rs.id,function(err,val){
                        rs.sheets = val;
                    });
                    res.push(rs);
                }

            callback(null,res);
/* По это */
        });
    },
    getProjectsSheets:function( id,callback ){
        var self = this,
            mysql = self.mysql,
            db = self.db,
            qr = "SELECT id, project_id ,sheet_name,label,current FROM sheets WHERE project_id = ? and showstatus = 0",
            arr = [id];

            db.query(qr,arr,function(err, result){
                if(err){
                    console.log("Can't make request: " + err);
                }
                callback(null,result)
            })
    }
  • Вопрос задан
  • 423 просмотра
Пригласить эксперта
Ответы на вопрос 1
WoLF_MaN
@WoLF_MaN Автор вопроса
NodeJS, JS developer
Выход был найден с помощью промисов(Promise)
Я обьединил две функции в одну в данном случае и воспользовался nodejs-q

С помощью функции spread дождался всех результатов def.promise и вызвал коллбэк функции в нужном месте.
getUserProjects:function(id,callback){
        var self = this,
            mysql = self.mysql,
            db = self.db,
            qr = "SELECT id, project_name, elem_markids FROM projects WHERE user_id = ? and showstatus = 0",
            arr = [id];
        var def = Q.defer();
        db.query(qr,arr,function(err, result){
            var res = [];
            if(err){
                console.log("Can't make request: " + err);
                if(callback) {
                    callback("query_error", undefined); //Сразу смотреть в логи.
                }
            }

            for(var i = 0; result.length > i;i++){
                var rs = result[i];
                var qr = "SELECT id, project_id ,sheet_name,label,current FROM sheets WHERE project_id = ? and showstatus = 0",
                    arr = [rs.id];
                db.query(qr,arr,function(err, result){
                    if(err){
                        console.log("Can't make request: " + err);
                    }
                    def.resolve([rs,result]);
                });
                res.push(def.promise);
            }
            Q.all(res).spread(function(){
                var res = [];
                for(var key in arguments){
                    var prom = arguments[key];
                    var proj = prom[0],sheets = prom[1];
                    proj.sheets = sheets;
                    res.push(proj);
                }
                callback(null,res);
            });

        });
    },
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы