我很难绕过预定义模块执行的回调。
我有一个socket.io客户端变量接收一个事件,它应该触发给定服务器的dns查找,然后向它发送一些东西。据我理解整个概念,我执行dns函数,并在回调中执行另一个连接到我的服务器的函数,然后又触发另一个回调,依此类推,对吧?所以我的代码看起来像:
io.sockets.on('connection', function (client) { // comes from socket.io module
client.on('myconnect', function (data) {
doDns(client, data.server);
});
}
var doDns = function (client, server) {
client.emit('status', {m: 'going to resolve domain'});
dns.resolve(server, 'A', doConnectToServer(???)); // comes from dns module
};
var doConnectToServer = function(???) {
client.emit('status', {m: 'going to connect to server now'});
// additional code goes here
}
所以这是我的问题:如何将 client 变量传递给下一个回调,而不会丢失dns.resolve()将传递给回调的内容?当我将线路更改为此...
dns.resolve(server, 'A', doConnectToServer);
...然后我可以在回调中访问dns结果,但是我丢失了我的客户端变量,“console.log(arguments)”只显示了从dns模块传递下来的params。当我这样做的时候......
dns.resolve(server, 'A', doConnectToServer(client));
...然后在我的回调中我错过了dns结果的变量。 “doConnectToServer”函数中的“console.log(arguments)”仅显示客户端变量。
那我该如何处理呢?
总的来说,我的整体呼叫流程是完全错误的(这是我的第一个node.js应用程序),或者这是你设计node.js应用程序的方式?
答案 0 :(得分:4)
你很亲密。只需从doDNS函数中传递参数。
io.sockets.on('connection', function (client) { // comes from socket.io module
client.on('myconnect', function (data) {
doDns(client, data.server);
});
}
var doDns = function (client, server) {
client.emit('status', {m: 'going to resolve domain'});
dns.resolve(server, 'A', function(err, addresses) {
if (err) throw new Error(err);
doConnecToServer(addresses, client);
}); // comes from dns module
};
var doConnectToServer = function(addresses, client) {
client.emit('status', {m: 'going to connect to server now'});
// additional code goes here
}