2017-05-22 81 views
0

我想從這個數據庫查詢返回的數據上調用一個函數,如下面的代碼片段所示。Javascript:將參數傳遞給回調函數

function connectDB(query, data, callback) { 
    pg.connect(process.env.DATABASE_URL, function (err, client) { 
     if (err) { 
      console.log(err); 
     } else { 
       client 
        .query(query, data, function (err, result) { 
         callback(result.rows);        
        }); 
     } 
    } 
} 

function foo(data) { 
    connectDB("SELECT * FROM mytable WHERE id=$1", someID, callbackfn(data)); 
} 

我不知道如何編寫callbackfn,以便我可以使用原始函數中的數據和db結果中的行。

function callbackfn(data) { 
    return function(rows) { 
    // Do something with rows and data 
    } 
} 
+1

您已經定義了'callback'作爲參數傳遞給'connectDB',所以,除非你通過一個名爲'callback'到'connectDB'功能,它不會被調用該功能。你也有一組奇怪的嵌套函數。目前還不完全清楚你想要做什麼。 –

+0

我澄清了一些事情。忽略嵌套函數(我刪除它們)。 – amo

+0

沒有特別的理由,從這個代碼本身,爲什麼這不起作用。我會建議在調用'callback'之前把'console.log('查詢')'之類的東西放在'callback'之前,以確保代碼得到那麼多。或者只是使用調試器並在那裏放置一個斷點。 –

回答

0

您不接受帶回調函數的任何參數。如何:

function callback(rows) { 
    /* not sure what your intention was here? nested functions? */ 
    return function() { 
    return function() { 
     // Do something with rows 
    } 
    } 
} 

而且要清楚,你可以張貼在那裏你調用connectDB功能?由於callback是變量名稱,它傳遞給connectDB

+0

我編輯了這個問題來澄清它。忽略嵌套函數,我嘗試了不同的東西,並且一度認爲它們是必需的。 – amo

0

你爲什麼要定義回調函數?請詳細說明這一點。此外,嘗試調用connectDB這樣的:

connectDB(query, data, function(rows) { 
     // Do something with rows 
}); 

在回調閱讀本answer

0

你有一個令人難以置信的嵌套功能級別。此外,您正在將回調定義爲參數,但如果您未調用基本函數再次傳遞「callback」作爲參數,它將不會採用您定義的回調函數。 如果您想要傳遞相同的回調,您提供它作爲參數沒有任何意義,您可以直接在「connectDB」函數中調用「回調」。而且你的回調函數會返回一個函數,所以應該再次使用()來調用它。 然後你的主回調函數需要接受來自外部的參數作爲參數。 我使用回調參數保留了你的代碼,因爲我「希望」同一個名字只是一個例子來解釋你想每次提供一個函數來操縱你想要的行。 你的代碼應該是這樣的:

function connectDB(query, data, callback) { 
    pg.connect(process.env.DATABASE_URL, function (err, client) { 
     if (err) { 
      console.log(err); 
     } else { 
       client 
        .query(query, data, function (err, result) { 
         // this returns a function so it needs to be called again 
         callback(result.rows)();        
        }); 
     } 
    } 
} 

// third inner function was useless 
function callback(rows) { 
    return function() { 
    // Do something with rows 
    } 
} 

// the third parameter HAS TO BE callback, otherwise you will not pass the function you defined. 
connectDB(query, data, callback);