2017-03-12 106 views
-1

我正在學習nodejs,express和mongoose。我想出了一個關於用於從數據庫檢索文檔的findOne函數的問題。 通常情況下,你會使用這樣的:貓鼬回調函數錯誤

Product.findOne({_id: req.params.id},function(error, result){ 
     res.send(result); 
}); 

但是,當我試圖做到以下幾點,它失敗(我這樣做只是學習的緣故):

Product.findOne({_id: req.params.id}, returnFunction(res)); 

function returnFunction(res,error, result){ 
    //error and result are provided by the findOne callback function 
    return function(){ 
      res.send(result); //doesnt work 
     }; 
    } 

但是,如果我通過參數的內部函數,它完美的作品:

Product.findOne({_id: req.params.id}, returnFunction(res)); 

function returnFunction(res,error, result){ 
     //error and result are provided by the findOne callback function 
     return function(res,result){ 
      res.send(result); 
     }; 
} 

是不是應該有訪問外部變量函數的內部函數?

謝謝。

+2

是的,但是你只傳遞'res',所以'error'和'result'是未定義的。 – JJJ

+0

但不是錯誤和結果隱含在函數中?因爲正如我所說的,即使我沒有傳遞這些變量,最後的代碼也能很好地工作。 –

+1

它們隱含在你返回的函數*中,而不是你自己調用的函數。 – JJJ

回答

1

當您撥打returnFunction(res)時,您實際上正在返回一個功能。

如果你定義功能,如:

function returnFunction(res, error, result){ 
    return function(){ 
      res.send(result); 
     }; 
    } 

你是返回一個函數,它沒有參數。這將是

Product.findOne({_id: req.params.id}, function(){ 
     res.send(result); // result is undefined here 
}); 

相當於但是,如果你定義您的函數:

function returnFunction(res){ 
     return function(error, result){ 
      res.send(result); // res is defined 
     }; 

沒關係。這相當於:

Product.findOne({_id: req.params.id},function(error, result){ 
     res.send(result); 
}); 
+0

我現在明白了!非常感謝!! :) –