如何获取函数返回值并将其传递给socket.emit?

时间:2015-11-12 01:09:32

标签: jquery node.js socket.io

我在传递查询的返回值时遇到问题。 当我尝试console.log时我的函数内的返回值。它显示了所有数据,但是当我尝试使用return时,它并没有传递数据undefined

这是我的代码:

server.js

var express = require('express');
var app = express();
var mysql = require('mysql');
var http = require('http').Server(app);
var io = require('socket.io')(http);
var port = process.env.PORT || 8000;

var connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: '',
    database: 'node'    
});

app.use(express.static(__dirname + '/public'));
app.use('/bower_components', express.static(__dirname + '/bower_components'));

app.get('/', function(req, res) {
    res.sendFile(__dirname + '/index.html');
});

connection.connect();

function loadList() {

    connection.query('SELECT * FROM inventory', function(err, rows, fields){

        if(err) throw err;
        //console.log(rows); --this is ok
        return rows; //cant return the data

    });

}

io.on('connection', function(socket){

    console.log('A user is connected!!');

    var product_list = loadList(); //return no result

    socket.emit('inventory list', {list: product_list});

    socket.on('disconnect', function() {
        console.log('user disconnected!');
    });

});

http.listen(8000, function() {
    console.log('Listening on ' + port);
});

对于我的index.html

<script type="text/javascript" src="/socket.io/socket.io.js"></script>
<script type="text/javascript" src="/bower_components/jquery/dist/jquery.min.js"></script>
<script type="text/javascript">

    try {
        var socket = io.connect('http://127.0.0.1:8000');
        //console.log(socket);
    }catch(e) {
        console.log('ERROR OCURRED: ' + e);
    }

    if(socket !== undefined) {
        socket.on('inventory list', function(data){
            console.log(data.list); //undefined return
        });
    }

</script>

你能帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

在nodejs中,I / O操作是异步的,因此您需要使用回调样式(或使用某些库来管理此行为,如promises或async), 看看this reference

function loadList(callback) {
 connection.query('SELECT * FROM inventory', function(err,rows,fields{
   //if(err) throw err; // when a error happen this will finish the main process
   if(err) return callback(err);
   return callback(null,rows)           
});
}


io.on('connection', function(socket){

    console.log('A user is connected!!');

    loadList(function(err,product_list){;
          socket.emit('inventory list', {list: product_list});
    }
});