2013-04-27 52 views
-1

返回傢伙。我不能用js回調返回來解決一些問題。 因此,我們有下一個FUNC:nodejs從回調

 //Функция получения контакт листа пользователя 
     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'接受回調並傳遞數據庫查詢的結果。 – 2013-04-27 13:03:23

+0

我認爲承諾會有助於這段代碼的可讀性。 – 2013-04-27 13:05:38

+0

請確定您想要保存的行對象的位置。您始終可以將回調函數作爲參數傳遞,並通過將行值作爲參數傳遞給它來調用它 – Tushar 2013-04-27 13:09:48

回答

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 

我希望它有一點幫助。