簡體   English   中英

將變量傳遞給Node.js中的回調

[英]Passing variables to callbacks in Node.js

我對節點很新,我正在嘗試創建一些獲取服務器信息的東西。 但這是我的問題。 我設置了一個配置對象(這將及時,由發生的事件動態更新),然后在函數中,我嘗試訪問該對象中的值。 (見下面的代碼)

首先,我設置我的變量:

var util            = require('util'),
    child           = require('child_process'),
    config          = {};

哪個工作正常。 然后我加載我的配置:

function loadConfig( )
{
    // Add some code for auto-loading of args
    config = {
        "daemons": [
            ["Apache", "apache2"],
            ["MySQL",  "mysqld"],
            ["SSH", "sshd"]
        ]
    };
}

並初始化調用該函數

loadConfig();

之后,我對守護進程進行檢查。

function getDaemonStatus( )
{
    for(var i=0; i<config.daemons.length; i++)
    {

        child.exec( 'ps ax -o \'%c %P\' | awk \'{if (($2 == 1) && ($1 == "\'' +
            config.daemons[i][1] + '\'")) print $0}\'',
            function( error, stdout, stderr )
        {

            console.log(config.daemons[i]);
        });
    }
}

我得到的回應是:

undefined
undefined
undefined

我真的不想使用GLOBAL變量,所以你們想到另一種方法來解決我的問題嗎?

謝謝! =]

由於執行的異步排序,這是很多人遇到的問題。

您的for循環將從0-3開始,然后當'i'為4時退出,顯然。 這里要記住的難點是你的exec回調不會立即運行。 僅在進程啟動后運行,並且在發生時,for循環將完成。

這意味着,基本上,你的回調函數運行的所有三次,你基本上是這樣做的:

console.log(config.daemons[4]);

這就是它打印'undefined'的原因。

您需要通過將循環內容包裝在匿名的自執行函數中來捕獲新范圍中的“i”值。

function getDaemonStatus( ) {
    for(var i=0; i<config.daemons.length; i++) {
        (function(i) {

             child.exec( 'ps ax -o \'%c %P\' | awk \'{if (($2 == 1) && ($1 == "\'' +
                config.daemons[i][1] + '\'")) print $0}\'',
                function( error, stdout, stderr ) {

                console.log(config.daemons[i]);
            });

        })(i);
    }
}

另外,我看到你的函數被稱為'getDaemonStatus'。 請記住,因為該exec回調是異步的,這也意味着您無法收集每個回調的結果,然后從getDaemonStatus返回它們。 相反,您需要傳遞一個自己的回調,並從您的exec回調中調用它。

更新

但請注意,每次迭代使用范圍的最簡單方法是使用forEach ,例如

function getDaemonStatus( ) {
    config.daemons.forEach(function(daemon, i){
         child.exec( 'ps ax -o \'%c %P\' | awk \'{if (($2 == 1) && ($1 == "\'' +
            daemon[1] + '\'")) print $0}\'',
            function( error, stdout, stderr ) {

            console.log(daemon);
        });
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM