从回调传递参数

时间:2011-08-31 14:02:58

标签: javascript node.js callback

基本上我需要将一个参数从一个回调传递给另一个回调。 这是代码:

var main = io
  .of('')
  .on('connection', function(socket){
    socket.on('joinDynNs',function(data,join_cb){
        var myBoard=0;
        routeToBoard("alex", "123", function(id) {
      myBoard=id;
      });
      var dyn_ns = io.of('/' + myBoard)
                       .on('connection', function(ns_socket){console.log('user connected to ' + myBoard);});
                       join_cb({namespace:myBoard});  
    });
  });

我的问题是我无法将routeToBoard中的“id”传递给myBoard变量。有人能帮我吗? 提前谢谢!

我的routeToBoard功能是:

function routeToBoard(userId, passw, cb) {
    var boardId = 0;
    var nStore = require('nstore/lib/nstore').extend(require('nstore/lib/nstore/query')());
    var users = nStore.new('data/users.db', function() {
        users.find({
            user: userId,
            pass: passw
        }, function(err, results) {
            if (err) {
                boardId = -1;
                console.log(err);
            } else {
                boardId = results.digitboard.board;
            }
            cb(boardId);
        });
    });
};

1 个答案:

答案 0 :(得分:0)

考虑在myBoard=id行调用新函数,例如parseNewId(id);并将其放在下一个逻辑中。 这是因为var dyn_ns...socket.on(...)初始化之后执行,而不是在它完成之后执行。所以myBoard还没有。 对不起,我错过了括号......但是你还需要在routeToBoard函数中移动你的id-id-get逻辑。

修改

'想法':

var res = document.getElementById("res");

res.innerHTML +="<br/>Init";
ioOn('connection', function (socket) {
      res.innerHTML +="<br/>ioOn callback";
      socketOn('joinDynNs', function (data, join_cb) {
          res.innerHTML +="<br/>socketOn callback";
          var myBoard = 111;

          routeToBoard("alex", "123", function (id) {
                                            res.innerHTML +="<br/>routeToBoard callback";
                                            myBoard = id;
                                            //var dyn_ns = io.of('/' + myBoard).on('connection', function (ns_socket) { console.log('user connected to ' + myBoard); });
                                        });
          join_cb({ namespace: myBoard });
      });
  });

 function delayMe()
 {
    var c=0
    for(var i=0;i<10000000;i++)
        c += i*Math.random();
 }

function ioOn(string, callback)
{
    res.innerHTML +="<br/>ioOn body";
     delayMe();
    callback("socket");
}
function socketOn(string, callback)
{
    res.innerHTML +="<br/>socketOn body";
    delayMe();
    callback("data",function(obj){alert("3"+" obj.namespace: " + obj.namespace)});
}
function routeToBoard(userId, passw, cb) {
    res.innerHTML +="<br/>routeToBoard body";
    delayMe();
    var boardId = 0;
    var users = fkc1('data/users.db', function(){
        res.innerHTML +="<br/>fkc1 callback";
        usersFind({
            user: userId,
            pass: passw
        },  function(err, results) {
                res.innerHTML +="<br/>userFind callback";
                cb(666);
            });
    });
}
function fkc1(string,callback)
{
    res.innerHTML +="<br/>fkc1 body";
    delayMe();
    callback();//no params callback
}

function usersFind(credentials,callback)
{
    res.innerHTML +="<br/>userFind body";
    delayMe();
    callback("er","result");
}

我觉得它没用。只是检查所有变量是否传递良好的主要想法。不幸的是我不知道这个node.js库,但这个概念对我来说并不陌生。

还将<div id="res" ></div>放入正文部分以查看结果......