在我自己的模块中实现回调

时间:2014-01-23 12:54:34

标签: javascript node.js

我遇到了问题,我猜解决方案是使用回调。但我不确定如何。 启动node.js时,将调用以下代码:

// create a new player and insert in the database
// the player gets inserted in the database correctly
var player1 = new player();

console.log(player1.id); // undefined

我的构造函数如下所示:

function Player(id) {

    // if we don't have a id, this player needs to be created
    this.id = (typeof id !== 'number') ? this.createPlayer() : this.setId(id);

}

然后我在数据库中创建了一个播放器:

Player.prototype.createPlayer = function () {

    var playerId = 0;

    connection.query("INSERT INTO players SET `created_at` = now()", function (err, result) {

        if (result) {

            playerId = result.insertId;

            console.log("Successfully inserted player no. " + playerId);

            this.id = parseInt(playerId, 10);

            return this.id;

        } else {

            console.log("Something went wrong: " + err);

        }

    });

};

我的猜测是我需要某种形式的回调,但我不确定我将如何做到这一点。向正确的方向小推动会很棒!

3 个答案:

答案 0 :(得分:0)

这是node.js EventEmitter的用例。您可以使用事件让应用程序知道您的对象初始化已完成并且可以使用它。 (我没有尝试过代码,但它应该以这种方式工作,如果没有,请告诉我)

var EventEmitter = require('events').EventEmitter;
var util = require('util');

// Define your class like
function Player(id) {   

    // if we don't have a id, this player needs to be created
    this.id = (typeof id !== 'number') ? this.createPlayer() : this.setId(id);
}
util.inherits(Player, EventEmitter);

Player.prototype.createPlayer = function (cb) {
    connection.query(sql, function (err, result) {
        if (result) {

            // to avoid triggering event before binding.
            process.nextTick(function () {
                // success! passing null as first argument and data as second
                this.emit('load', null, this.id);
            });

        } else {

            process.nextTick(function () { 
                this.emit('load', err, null); // passing err as first argument
            });

        }
    });
};

// And, use your class like
var player1 = new player();

player1.on('load', function (err, id) {
    console.log(player1.id);
});

根据您的评论,createPlayer并非总是被调用,即仅在某些情况下被调用。因此,如果您不想致电emit,可以使用相同的createPlayer

希望有所帮助

答案 1 :(得分:0)

在Node.js中,有许多方法可以排队回调函数。这些都记录在这里:http://nodejs.org/api/timers.html#timers_setimmediate_callback_arg

添加两个数字并将结果传递给回调的一个示例是:

function addWithCallback(a, b, callback) {
    process.setImmediate(callback, a+b);
}

就像你能做到的那样:

addWithCallback(1,3,foo);

和foo将排入事件循环并在执行时传递1 + 3的结果。还可以看看:

http://howtonode.org/understanding-process-next-ticksetImmediate vs. nextTick

绝对是你问题的完整解决方案,但希望你想要的“向正确方向小推”:)

答案 2 :(得分:-2)

基本上,回调只是一个函数来调用然后完成某些事情

function asyncAdd(v1,v2,callback){
  var total = v1 + v2;
  callback(total);
}

asyncAdd(1,2,function(t){
  alert(t);
});

与此对比:

syncAdd(v1,v2){
  return total;
}

希望这应该足以让你开始。

这里有更好的解释:http://recurial.com/programming/understanding-callback-functions-in-javascript/