gpt4 book ai didi

javascript - socket.io 函数在回调完成之前返回 - Node.js

转载 作者:行者123 更新时间:2023-12-03 04:55:20 24 4
gpt4 key购买 nike

在socket.io函数中,我正在数据库中创建新用户并返回插入的ID。但我的函数在数据库回调完成之前返回。所以我将插入的 ID 返回到客户端:

  io.on('connection',function (socket) {
socket.on('newUser',function (user) {
io.emit('newUser',createChatRoom(con,user.email,user.phone));
});

});

我的创建用户功能:

var createChatRoom = function (con, email, phone) {
con.query("SELECT * FROM USER WHERE `email`='" + email + "'", function (error, result) {
if (error) throw error;
if (result.length == 0) {
var chatToken = require('crypto').createHash('md5').update(email).digest("hex");
con.query("INSERT INTO user(email,chat_token,phone) VALUES('" + email + "','" + chatToken + "','" + phone + "')", function (error1, result1) {
return result1.insertId;
});
} else {
return "Old User";
}
});
};

最佳答案

您遇到过一些异步 JavaScript!

您使用 con.query 对数据库进行的调用实际上并不像您想象的那样立即完成,因为它们是我们所说的“非阻塞”。

网络请求是“非阻塞”的,可能需要一些未知的时间才能完成。如果这是一个“阻塞”操作,您的程序将等待数据库的响应。您无法阻止 JavaScript 中的执行,因为所有内容都在幕后的一个大循环中运行。

为了解决这个问题,我们使用回调函数来使请求“非阻塞”。您实际上已经在使用它们了!我们的想法是,我们将一个函数作为参数传递给我们知道需要一些时间才能完成的操作。当可能长时间运行的操作完成时,它会使用结果调用您的回调函数。

在您的代码中,查询运行后,将调用提供的回调函数。

con.query("INSERT INTO user(email,chat_token,phone) VALUES('" + email + "','" + chatToken + "','" + phone + "')", function (error1, result1) {

解决您的特定问题的方法是让您的 createChatRoom 函数将回调作为参数。

io.on('connection',function (socket) {
socket.on('newUser',function (user) {
createChatRoom(con, user.email, user.phone, function (error, result1) {
if (error) {
// hanlde your error
// return
}
io.emit('newUser', result1);
})
});
});

var createChatRoom = function (con, email, phone, callback) {
con.query("SELECT * FROM USER WHERE `email`='" + email + "'", function (error, result) {
if (error) {
return callback(error);
}
if (result.length == 0) {
var chatToken = require('crypto').createHash('md5').update(email).digest("hex");
con.query("INSERT INTO user(email,chat_token,phone) VALUES('" + email + "','" + chatToken + "','" + phone + "')", function (error1, result1) {
if (error1) {
return callback(error1)
}
return callback(null, result1.insertId)
});
} else {
return callback(null, "Old User");
}
});
};

您可能需要进行一些更改,但希望您能明白!

Here's a talk我就这个主题给出了blog post .

关于javascript - socket.io 函数在回调完成之前返回 - Node.js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42459926/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com