2016-12-05 2 views
0

Я смотрел на другие вопросы переполнения стека, и я все еще не могу понять, что у меня. Я получаю эту ошибку в консоли браузера:Ошибка функции Meteor/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"); 
 
    } 
 
}

EDIT: Вы все меня идти в правильном направлении. Вот исправленный код:

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) 
      } 
     } 
    ); 
} 

Нет, вы видите, что это не так.

Смежные вопросы