2016-12-05 147 views
0

我一直在寻找其他堆栈溢出的问题,我仍然无法找到矿井。我得到在浏览器控制台这个错误:流星/ Javascript函数错误 - TypeError:回调不是函数

Exception in delivering result of invoking 'formMethod1': TypeError: callback is not a function 

我已经把我下面的代码和注释就行了错误的引用。看起来“err”对象没有被传递,但是回调实际上被调用并且整个事情都经过了,它从来没有捕捉到错误。

submitForm1(entry, 
 
\t processForm1(err,res,entry,function(err,res){ 
 
\t \t //Done processing 
 
\t \t console.log(err); //Doesn't work 
 
\t \t console.log(res); //Doesn't work 
 
\t \t console.log("Done"); //Works 
 
    }) 
 
) \t \t \t 
 

 
function submitForm1(entry, callback) { 
 

 
    Meteor.call('formMethod1', { 
 
      params: { 
 
       user: Meteor.user().username, 
 
       activity: entry 
 
      } 
 
     }, function(err,res){ 
 
      if(err){ 
 
      \t console.log(err) //Works 
 
       callback(err, res, entry) //This is where the error happens 
 
      } else{ 
 
       callback(undefined, res, entry) 
 
      } 
 
     } 
 
    ); 
 
} 
 

 
function processForm1(err, res, entry, callback) { 
 
\t console.log(err); //Doesn't work 
 
\t console.log(res); //Works 
 
\t console.log(entry); //Works 
 
    if (err) { 
 
     if (err.error == "1001") { //Activity not found 
 
      //Handle Error 
 
      callback("Activity Not Found"); 
 
     } else { 
 
      //Handle Error 
 
      callback(err.message); 
 
     } 
 
    } else { //No Errors 
 
     callback(undefined,"Submitted"); 
 
    } 
 
}

编辑:你们都让我去在正确的方向。下面是更正后的代码:

submitForm1(entry, function(err,res){ 
 
    processForm1(err,res,entry,function(err,res){ 
 
     //Done processing 
 
\t \t console.log(err); 
 
\t \t console.log(res); 
 
\t \t console.log("Done"); 
 
    }) 
 
});

+0

processForm1不返回函数。如果您想调用它并将其结果用作回调函数,则需要它返回一个函数。 –

+0

当您调用submitForm1时,您正在使用两个级别的回调函数,是否因为它使逻辑有点复杂而需要这样做? – Yaser

回答

1

要调用传递回调函数,而不是......通过它,但是再经过另一个函数作为参数,以。我认为你混合了两种相同功能的味道,混合在一起。解决这样的:

submitForm1(entry, 
    function (err,res,entry) { 
     //Done processing 
     console.log(err); 
     console.log(res); 
     console.log("Done"); 
    } 
)   
+0

谢谢!这让我朝着正确的方向前进。原来,我还继承了一个'res'对象,这对对故障排除没有帮助。我会用固定代码更新我的问题。 – dotbat

+0

请注意,在编辑您的问题时,传递给回调函数的第三个参数将无处可用。 – trincot

+0

谢谢。我也错过了。 – dotbat

1

你传入processForm1作为回调submitForm1。如果你这样做,你必须确保在processForm1内部调用的签名匹配(err, res, entry, callback)

这意味着您需要在submitForm1之内传递一个方法作为回调,该方法会在其中调用。说得通?

为了简单起见,让我们这样说:

 function submitForm1(entry, function(err,res,entry,function(err,res){ 
      //Done processing 
      console.log(err); //Doesn't work 
      console.log(res); //Doesn't work 
      console.log("Done"); //Works 
    }) { 

    Meteor.call('formMethod1', { 
      params: { 
       user: Meteor.user().username, 
       activity: entry 
      } 
     }, function(err,res){ 
      if(err){ 
       console.log(err) //Works 
       callback(err, res, entry) //This is where the error happens 
      } else{ 
       callback(undefined, res, entry) 
      } 
     } 
    ); 
} 

没有看到有什么不对。