2016-04-16 230 views
0

在Node.JS中,我有一個連接MySQL數據庫的函數,得到一堆行,然後將它們作爲數組返回。我的問題是asynchronous的代碼,我正在使用async Node.JS模塊。Node.JS函數返回異步回調函數的值

這是我的功能至今:

var async = require("async") 
function get_all_channels_by_order(){ 
    async.waterfall([ 
     function(callback){ 
      mysql_connection.connect() 
      mysql_connection.query("SELECT * FROM channels ORDER BY listorder ASC", function(err, result){ 
       callback(null, result) 
      }) 
     } 
    ], function(err, result){ 
     mysql_connection.end() 
     return result 
    }) 
    //return ?? somehow, return the value from the MySQL query? 
} 
console.log(get_all_channels_by_order()) 

出現問題時行呼籲對功能已經檢查,即使它尚未發送的返回值。

這怎麼辦?它甚至有可能嗎?我意識到我可以不使用這個功能,並且在我需要時手動執行查詢,但是這最終會完全沒有組織和混亂。

我以前問過這個問題「Change a variable from outside it's scope」這是註明爲「Why is my variable unaltered after I modify it inside of a function? - Asynchronous code reference」一式二份,有關異步代碼這個問題的談判,而不是如何有一個函數返回從它的值,我無法弄清楚如何。

+0

你必須有'回調(函數作爲參數)''中的功能get_all_channels_by_order'處理'result' – Rayon

+1

著名DUP http://stackoverflow.com/questions/14220321/how-do-i從異步調用返回響應 – elclanrs

+0

_從文檔中,_運行串聯函數的任務數組,每個函數都將結果傳遞給數組中的下一個。但是,如果任何任務將錯誤傳遞給自己的回調,則不執行下一個函數,並立即調用主回調並返回錯誤。 __waterfall(任務,[回調])__ – Rayon

回答

1

由於它是異步代碼您必須使用回調來獲取數據。

您認爲如果您使用async包,它會幫助你做return result

  • 不,你不能。

當你有很多函數使用前一個函數的結果時,異步包有助於擺脫回調 - 地獄。

在你的情況你不需要異步。

請閱讀或觀看關於nodejs異步行爲的教程。例如本系列教程:timeline 03:00 where explains blocking vs non-blocking code

因此,要獲得數據後,查詢執行僅僅是這樣說的:

mysql_connection.connect(); 

function get_all_channels_by_order(callback){ 
    mysql_connection.query("SELECT * FROM channels ORDER BY listorder ASC", callback); 
} 

get_all_channels_by_order(function(err, result) { 
    if(err) { 
    console.error(err); 
    return; 
    } 

    console.log(result); 
}); 
+0

感謝這是完美的(抱歉的愚蠢,我做了研究,看了,我沒有看到這個問題'http://stackoverflow.com/questions/14220321/how-做-I-返回的響應從 - 一個異步呼叫') – ZeroByter