2013-04-27 8 views
-1

ребята. Я не могу разрешить некоторый пролет с возвратом обратного вызова js. Итак, мы имеем следующую FUNC:nodejs return from callbacks

 //Функция получения контакт листа пользователя 
     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-лвл обратного вызова, но если я создать глобальные переменные или писать «строку» в глобальный объект, это не работает. Помогите мне! Спасибо!

+0

Хотя это другой контекст, вы должны прочитать мой ответ здесь, чтобы узнать об синхронном и асинхронном коде: http://stackoverflow.com/a/14220323/218196. Вы должны заставить 'get_contact_list' принять обратный вызов и передать результат запроса БД. –

+0

Я думаю, что обещания помогут читабельности этого кода. –

+0

Укажите, где вы хотите сохранить объект строки. Вы всегда можете передать функцию обратного вызова в качестве параметра и вызывать его, передавая значение строки в качестве параметра для него – Tushar

ответ

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 

Надеюсь, это поможет немного.