NodeJS v0.10.33 / Javascript を使用すると奇妙な問題が発生します。Hapi 8.0.0
、mongoose
、moment
およびrequest
libsも使用しています。
条件がTRUEかFALSEかを知るためにメソッド呼び出しを待つ必要がある単純なIFを実行しようとしています。デフォルトの実行の代わりに、私のコードは条件自体の前に条件コンテンツを実行しています。呼び出されたメソッドからの戻りを待たずに常に「TRUE」を実行しているようなものです。
私はそのようなものを持っています:
function isUpdated(){
var updated = true;
if (updated) {
console.log("Updated (inside isUpdated)");
} else {
console.log("Not updated (inside isUpdated)");
}
}
if (!isUpdated()) {
console.log("Not updated. Updating..");
} else {
console.log("Updated");
}
しかし、サーバーを実行すると、次のようになりました。
[paladini@pet01 myFolder]$ node server.js
Server running at: http://pet01.inf.ufsc.br:3000
Not updated. Updating..
Updated (inside isUpdated)
ご覧のとおり、IF コンテンツは条件自体の前に実行されています。
私の完全なコードは次のとおりです(update()
最初に実行されます):
function isUpdated(myTicker) {
myTicker = myTicker || undefined
Ticker.count({}, function(err, count){
if (!err) {
// Verify if must check all tickers or just one.
if (myTicker == undefined) {
if (count == 0) {
console.log("Exchanges count = 0");
} else {
// Checking if the database is outdated (must update every 2 minutes).
Ticker.find().lean().exec(function(err, allTickers){
if (!err) {
if (moment(allTickers[0].updatedAt) >= moment().subtract(2, 'm')) {
console.log("Entered IF, already updated.");
return true;
}
} else {
console.log("Erro!");
}
});
}
} else {
console.log("Ticker defined, nothing to do.");
}
}
return false;
});
}
function update(callback) {
var atualizado = isUpdated();
if (!atualizado) {
// Updating exchanges informations.
var exchangesUpdated = {value: 0};
var updateAll = function() {
api.bitcoinToYou.updateTicker(exchangesUpdated);
}
console.log("Not updated. Updating..");
updateAll();
// Waiting to run the callback.
var timeoutTime = 50;
var myFunctionToTimeout = function() {
// Get the exchanges count
Ticker.count({}, function(err, count){
if (!err) {
if (exchangesUpdated["value"] != count) {
setTimeout(myFunctionToTimeout, timeoutTime);
} else {
callback();
}
}
});
}
setTimeout(myFunctionToTimeout, timeoutTime);
} else {
console.log("Updated.")
callback();
}
}
次のシナリオがあります。
- 初めて update() が実行されたとき: データベースが更新されて戻ります。
- 2 分前に実行: 更新されずに戻ります。
- 2 分後に実行: データベースが更新されて戻ります。
問題は 2º のシナリオにあります。データベースは常に更新されます (isUpdated() メソッドは問題ないと思いますが、update() は間違っています)。2º のシナリオをシミュレートすると、ターミナルに次のログが表示されます。
[paladini@pet01 myProject]$ node server.js
Server running at: http://pet01.inf.ufsc.br:3000
Not updated. Updating..
Entered IF, already updated.
私が間違っていることは何ですか?これは NodeJS または Hapi の問題ですか?