2014-04-03 74 views
0

我想從這個異步函數exports.getServices得到一個返回值。但我沒有得到任何回報。如何從Node.js中的異步函數獲取返回值?

 var http = require("http"); 
     var mysql = require('mysql'); 
     var url = require("url"); 

     var connection = mysql.createConnection({ 
     ... 
     }); 

     connection.connect(); 

     exports.getServices = function(){ 
      connection.query('SELECT DISTINCT SERVICE FROM booking_count', function(err, rows, fields) { 
       if (err) throw err; 
       var services = new Array(); 
       for (var i in rows) { 
        services[i] = rows[i].SERVICE; 
       } 
       return services; 
      }); 
     } 

我從另一個模塊訪問這個方法:

var express = require('express'); 
var hbs = require('express3-handlebars'); 

var app = express(); 
app.engine('html', hbs({defaultLayout: 'layout'})); 
app.set('view engine', 'html'); 
app.set('views', __dirname + '\\views'); 
app.use(express.bodyParser()); 

var mysql = require('./mysql'); 

app.get('/', function(req, res) { 
    res.render('index',{title:"Services", services:mysql.getServices()}); 
}); 

app.get('/article/:id', function(req, res) { 
    var entry = blogEngine.getBlogEntry(req.params.id); 
    res.render('article',{title:entry.title, blog:entry}); 
}); 

app.listen(3000); 

這將是非常有益的,如果你能發佈更正後的代碼。非常感謝您提前!

回答

3

您不提供任何有關使用哪個模塊的信息connection。此外,您不完全清楚哪個函數[getServices()或傳遞給query()的回調函數]沒有返回任何內容。不過,我仍然會試着回答你的問題。

  1. getServices()功能不會返回任何東西 - 它只是調用查詢()。所以,很顯然,你不能指望得到這樣的結果:

    var result = getServices(...);

  2. 的回調函數並返回一個值,但由於它是query()功能正在調用它,也沒辦法讓你獲得那個回報價值。無論如何,query()可能會忽略任何返回值。

要解決這個問題,你需要傳遞給getServices()自己的回調函數接收結果。所以,你的實現應該看起來更像是這樣的:

connection.connect(); 

exports.getServices = function (next) { 
    connection.query('SELECT DISTINCT SERVICE FROM booking_count', function(err, rows, fields) { 
     if (err) throw err; 
     var services = new Array(); 
     for (var i in rows) { 
      services[i] = rows[i].SERVICE; 
     } 
     next(services); 
    }); 
} 

然而,你應該如果拋出一個錯誤,找出(在原來的回調,當有錯誤)會導致問題(如導致服務器崩潰) 。您可能想要做其他事情:

connection.connect(); 

exports.getServices = function (next) { 
    connection.query('SELECT DISTINCT SERVICE FROM booking_count', function(err, rows, fields) { 
     if (err) return next(err); // Pass err to next, and immediately return. 
     var services = new Array(); 
     for (var i in rows) { 
      services[i] = rows[i].SERVICE; 
     } 
     next(null, services); // Pass result to next (with no error). 
    }); 
} 

歡迎來到異步函數編程的世界!

+0

非常感謝。你可以發佈如何作爲回調方法「下一個」傳遞的函數應該是什麼樣子?還有我在另一個模塊中調用的方法? – user3494729

相關問題