передача параметров из обратных вызовов - PullRequest
0 голосов
/ 31 августа 2011

В основном мне нужно передать параметр в результате одного обратного вызова другому. Вот код:

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});  
    });
  });

Моя проблема в том, что я не могу передать "id" из routeToBoard в переменную 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 голосов
/ 31 августа 2011

Подумайте о вызове новой функции в строке myBoard=id, например, parseNewId(id);, и добавьте туда следующую логику. Это потому, что var dyn_ns... выполняется сразу после инициализации socket.on(...), а не после ее завершения. Так что myBoard еще нет. Извините, я пропустил скобки ... Но все же вам нужно переместить логику after-id-get внутри этой функции routeToBoard.

EDIT

«Идея»:

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> в раздел тела, чтобы увидеть результаты ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...