在nodejs中的回调链中传递其他参数

时间:2012-01-25 22:21:35

标签: node.js

我很难绕过预定义模块执行的回调。

我有一个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应用程序的方式?

1 个答案:

答案 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
}