-1

彼ら。私はjsコールバックリターンでいくつかの問題を解決できません。したがって、次の機能があります。

     //Функция получения контакт листа пользователя
        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;
        }

2-lvl コールバックから変数行を返す必要がありますが、グローバル変数を作成するか、グローバル オブジェクトに「行」を書き込むと、機能しません。助けてください!ありがとうございました!

4

1 に答える 1

3

非同期コードの概念を正しく理解していないと思います。例が長すぎるため、非同期コードがどの順序で機能するかを示す擬似コードを次に示します。

// 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

少しでもお役に立てば幸いです。

于 2013-04-27T18:23:40.047 に答える