2017-04-20 27 views
0

我要調用一個函數在同一個控制器,但我主要是有這樣的錯誤:「的ReferenceError:myFunctionB沒有定義」SailsJs通話功能到同一個控制器

module.exports = { 

    myfunctionA: function(req, res){ 

     var theword; 
     theword = myFunctionB({id:26}) 

     return res.json({say:theword}) 

    }, 

    myfunctionB: function(req, res){ 

     var id = req.param('id'); 

     niceword.get({ 
      id:id 
     }, function(err, word){ 

      if(err){return res.negotiate(err);} 
      if(!word){return res.json({err:"no word found"})} 

      return res.json({word:word}); 

     }) 

    } 

} 

我也把myFunctionB tryed到一個服務,但是,因爲我使用許多其他控制器等我沒有迴應..任何想法?

+0

你不能做到這一點。或者至少不應該。如果你不得不從幾個地方調用相同的功能,請創建一個服務 – yBrodsky

+0

感謝您的參考,我嘗試投入服務,但由於間隔時間我嘗試與我的數據庫進行通信時沒有響應,真的知道...? – Nastyo

+0

是的,這個函數需要回調或者返回一個承諾,因爲你會在裏面做異步的東西。 – yBrodsky

回答

0

有幾種方法可以做到這一點。正確的方法,如yBrodsky說,是創建一個運行回調或返回一個承諾服務:

myServiceFunctionB: function(params, cb) { 
    var id = params.id; 
    niceword.get({ 
     id:id 
    }, function(err, word){ 
     return cb({ say: { word: word }); 
    }); 
} 

然後在你的控制器,只需使用:

return MyServiceName.myServiceFunctionB({id: 26}, res.json); 

您也可以通過在您的REQ和RES繼續使用那些:

myServiceFunctionB: function(req, res) { ... 

或者,你可以使用this關鍵字在你的控制器:

myfunctionA: function(req, res){ 
    req.params.id = 26; 
    return this.myfunctionB(req, res); 
} 

如果你會做其中的上下文丟失更復雜的邏輯,使用這只是設定在開始一個新變種:

myfunctionA: function(req, res){ 
    var self = this; 
    req.params.id = 26; 
    //...lots of nested promises or callbacks... 
     return self.myfunctionB(req, res); 
} 
0

謝謝yBrodsky和wwwslinge,我finaly得到我需要什麼謝謝你。

我不得不做一點改變,因爲在他們進入函數後仍然需要使用數據。

控制器

MyServiceName.functionB({id:1}, function(data){ 

    // doing some stuff with the data and then 
    return res.json({data: data}); 

}); 

服務

functionB: function(params, cb){ 

    var id = params.id; 

    Niceword.getbyid({ 
     id:id 
    }, function(err, word){ 

     if(err){return err} 
     return cb({word:word}); 

    }) 

}