2014-01-23 17 views
0

我有一個問題,我想解決方案是使用回調。但我不知道如何。 當開始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); 

     } 

    }); 

}; 

我的猜測是我需要某種形式的回調,但我不知道我將如何做到這一點。向正確的方向小推一下會很棒!

+0

的可能重複[如何從返回值回調函數](http://stackoverflow.com/questions/6847697/how-to-return-value-from-callback-function);簡而言之,''return this.id''不會做你認爲它做的事。 – Louis

回答

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並不總是叫,即只在一定的條件。所以如果您不想撥打createPlayer,您可以使用相同的emit

希望幫助

+0

謝謝,這有幫助。我不得不改變一些代碼,因爲我忘記了我們改變了範圍。在查詢this =/= player的回調中。 – Martijn

-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/

+0

也許我誤解了這個問題,但這個答案似乎不對。回調指向通常是爲了阻止執行,所以理想情況下回調應該在事件循環中排隊,而不是在函數結束時同步執行... 例如:http://nodejs.org/api /timers.html#timers_setimmediate_callback_arg – Owen

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

絕對是一個完整的解決方案,以你的問題,但希望「在正確的方向推小」你想:)