简体   繁体   English

Node.js从回调返回

[英]nodejs return from callbacks

guys. 伙计们 I cant resolve some prolem with js callback return. 我无法解决js回调返回的问题。 So, we have next func: 因此,我们有了下一个功能:

     //Функция получения контакт листа пользователя
        function get_contact_list(data) {
            //Берем ID пользователя, который к нам пытается обратиться исходя из SESSION_ID
            conn.query('SELECT id FROM users WHERE session_id="' + data['auth'] + '" LIMIT 1;', function(err, res) {
                if (err) {
                    console.log(err);
                }
                //Разбираем результат
                res.fetchAll(function(err, row) {
                    if (err) {
                        console.log(err);
                    }
                    //А теперь, собсна, выбираем контакты
                    conn.query('SELECT u.id, u.sname, u.fname, u.nick FROM users as u LEFT JOIN contacts AS c ON c.dep_id = u.id WHERE owner_id =' + row[0].id + ';', function(err, res) {
                        if (err) {
                            console.log(err);
                        }
                        //Разбираем результат
                        res.fetchAll(function(err, row) {
                            if (err) {
                                console.log(err);
                            }
                            //TAKE row HEREOF
                            NEED_OUT = row;
                        });
                    });
                });
            });
            return NEED_OUT;
        }

I need return variable row from 2-lvl callback, but if i create global var or write "row" in global object, it's not working. 我需要从2-lvl回调返回变量行,但是如果我创建全局变量或在全局对象中写入“行”,则该行不起作用。 Help me pls! 请帮我! Thank you! 谢谢!

I believe you didn't get the concept of async code right. 我相信您没有正确理解异步代码的概念。 Because you example is way to long, here some pseudo code that shows you in which order async code will work. 因为您的示例很长,所以这里有一些伪代码向您显示异步代码的工作顺序。

// Timestamp: 0
function foo(input, cb) {
    // Timestamp: 2
    doSomeThingAsync(input, (result) {
        // Timestamp: 5
        result = transformResultSync(result);
        cb(result);
    });
    // Timestamp: 3
}
// Timestamp: 1
foo('bar', function(result) {
    // Timestamp: 6
    console.log(result);
});
// Timestamp: 4

I hope it helps a little bit. 希望对您有所帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM