2016-01-17 33 views
1

我使用前綴_this從一個回調函數調用它時引用父類函數。但是,當我運行節點服務器時,出現錯誤消息'_this is not defined'。實際上,我直接從我正在學習的MEAN堆棧書中抽取這些代碼,但似乎無法解決此問題。使用_this來引用父類方法

父函數

var getErrorMessage = function(err){ 
var message = ''; 
if(err.code){ 
    switch(err.code){ 
     case 11000: 
     case 11001: 
     message = 'Username already exists'; 
     break; 
     default: 
     message = 'Something went Wrong'; 
    } 
} else{ 
    for(var errName in err.errors){ 
     if(err.errors[errName].message){ 
      message = err.errors[errName].message; 
     } 
    } 
} 

return message; 
}; 

被調用函數中的回調以後

exports.saveOAuthUserProfile = function(req, profile, done){ 
User.findOne({provider: profile.provider, providerId: profile.providerId}, function(err,user){ 
    if(err){ 
     return done(err); 
    } else{ 
     if(!user){ 
      var possibleUsername = profile.username || ((profile.email) ? profile.email.split('@')[0] : ''); 

      User.findUniqueUsername(possibleUsername, null, function(availableUsername){ 
       profile.username = availableUsername; 

       user = new User(profile); 

       user.save(function(err){ 
        if(err){ 
         var message = _this.getErrorMessage(err); 
         req.flash('error',message); 

         return res.redirect('/signup'); 
        } else{ 
         return done(err,user); 
        } 
       }); 
      }); 
     } else{ 
      return done(err, user); 
     } 
    } 
}); 
}; 
+0

其中'_this'變量聲明爲'var _this = something' – Nirus

+0

我沒有在任何地方聲明這是令人困惑的地方。這些代碼行直接從本書中獲取。它可能有助於注意到他有var message = \ _this.getErrorMessage ...在兩行分開,第2行以_this.get開頭....我試着從頭開始「\ _」,但後來我得到「.getErrorMessage()」不存在的消息。 –

+0

那麼在這種情況下'_this'必須被定義,它不是一個保留關鍵字或任何類型,但'this'是一個保留關鍵字。我建議你刪除'_this'並直接調用你打算調用的方法。如果你仍然想'_this',那麼聲明'var _this = {}; _this.getErrorMessage = getErrorMessage'。它應該與分手合作。使用剛纔的getErrorMessage()工作的 – Nirus

回答

1

在延續與評論

在全球範圍內的父功能後聲明如下。

var _this = {}; 
_this.getErrorMessage = getErrorMessage; // Passing the function reference 

回調

_this.getErrorMessage(/*YOUR_PARAMETERS_HERE*/); 

後來另外,您可以完全刪除_this和直接調用函數作爲母函數在全局範圍內。

注:理解既是父函數和回調是在同一個.js文件與父函數宣佈全球範圍內關於該.js文件並沒有被聲明爲GLOBAL.getErrorMessage這使得它明確全球爲window對象客戶端。

+0

。必須是書中的錯字。 –