2

NodeJS v0.10.33 / Javascript を使用すると奇妙な問題が発生します。Hapi 8.0.0mongoosemomentおよびrequestlibsも使用しています。

条件が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();
    }
}

次のシナリオがあります。

  1. 初めて update() が実行されたとき: データベースが更新されて戻ります。
  2. 2 分前に実行: 更新されずに戻ります。
  3. 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 の問題ですか?

4

1 に答える 1

-1

isUpdated から値を返すのを忘れています

于 2014-12-31T00:43:46.303 に答える