Проблема с функцией обратного вызова - javascript / node.js

1

Я делаю приложение Vote, теперь я пытаюсь проверить, проголосовал ли пользователь за текущий опрос. Моя проблема, я думаю, является функцией обратного вызова, которая не работает в то время, которое я хочу. Я пробую много методов и много читаю о функции обратного вызова и синхронизации, и до сих пор не знаю, как исправить эту проблему.
Теперь код (все в одном маршруте):

Здесь я нахожу опрос, который голосовал пользователь:

Poll.findById(req.params.id,function(err, poll){     //Find the Poll
       if(err){
           console.log("Vote(find the Poll) post err");
        }
        var test = function(poll,req){                            //check if user already vote to the poll
                if(req.user.local){//if it auth user
                    console.log("test");
                    User.findById(req.user._id,function(err, userFound){
                        if(err){
                            console.log("[checkVoted] Error findById");
                        }
                    for(var i=0;i<userFound.local.vote.poll_voted.length;i++){//run on poll_voted array
                        console.log("test for");
                        if(poll._id == userFound.local.vote.poll_voted[i]){
                            console.log("**return 1**");
                            return 1;//User already voted to this poll
                        }
                    }//end for
                    console.log("test return 0");
                    return 0;//user not voted
                    });//end user find
                } else{ //anonmey user 
                    console.log("[checkVoted] ELSE!");
                    return false;
                }//else end
            };//function end

после вызова функции тестирования здесь:

 **if(test(poll,req))**{ //If user already voted, redirect
                console.log("already vote");
                res.redirect("/poll/"+poll._id);
            }**else**{//User not voted. 
                console.log("test Else not voted");
                User.findById(req.user._id, function(err, user) {//find the id and save in voted poll
                    if(err){
                        console.log("[VOTE>POST>User.findByID ERROR");
                    } else{
                        user.local.vote.poll_voted.push(poll._id); 
                        user.save(function(err){
                        if(err){
                            console.log("save user._id in poll_voted ERORR");
                        }});
                    }});//end User.findById
                var options = poll.options;
                var optionIndex = _.findIndex(options,["id", req.params.option_id]);
                poll.options[optionIndex].vote++;
                poll.save(function(err){
                if(err){
                   console.log("save vote error");
                } else{
                   res.redirect("/poll/"+poll._id);
                }
            });
        }//end of else
    });//end of Poll findById

Теперь пользователь выбирает параметры и голосует, его вводит функцию и записывает "возврат 1" (помечен), но он не входит в IF (помечен) и ofcurse в else (makred)... что я делаю неправильно?

EDIT: я пробую этот метод, из журнала это работает, но у меня есть antoher ошибка сейчас: EDIT 2: SOLVED.this код :( Спасибо всем)

router.post("/poll/:id/:option_id", function(req, res){
   Poll.findById(req.params.id,function(err, poll){     //Find the Poll
       if(err){
           console.log("Vote(find the Poll) post err");
        }
        var test = function(poll,req, callback){
                var flag=0;
                if(req.user.local){//if it auth user
                    console.log("test");
                    User.findById(req.user._id,function(err, userFound){//look for id user
                        if(err){
                            console.log("[checkVoted] Error findById");
                            }
                        for(var i=0;i<userFound.local.vote.poll_voted.length;i++){//runnig on poll_voted array
                            console.log("test for");
                            if(poll._id == userFound.local.vote.poll_voted[i]){
                                console.log("**return 1**");
                                flag=1;//User already voted to this poll
                            }
                        }{//end for
                    console.log("test return 0");
                    callback(flag);
                    }});//end user find
                }//end if auth user
            };//test function end
            test(poll, req, function(param){
                if(param){
                    console.log("already vote");
                    res.redirect("/poll/"+poll._id);
                } else{
                    console.log("test Else not voted");
                    User.findById(req.user._id, function(err, user) {//find the id and save in voted poll
                        console.log("user findbyid succes");
                        if(err){
                            console.log("[VOTE>POST>User.findByID ERROR");
                        } else{
                            console.log("user findbyid succes else");
                            user.local.vote.poll_voted.push(poll._id); 
                            user.save(function(err){
                                if(err){
                                console.log("save user._id in poll_voted ERORR");
                            }});
                    }});//end User.findById
                    console.log("user save the vote start");
                    var options = poll.options;
                    var optionIndex = _.findIndex(options,["id", req.params.option_id]);
                    poll.options[optionIndex].vote++;
                    poll.save(function(err){
                    if(err){
                        console.log("save vote error");
                    } else{
                        console.log("user save the vote finsh");
                        res.redirect("/poll/"+poll._id);
                    }});
                }});
            });
});
Error: Can't set headers after they are sent
  • 2
    Возможный дубликат Как я могу вернуть ответ от асинхронного вызова?
  • 0
    спасибо, но я прочитал эту статью, попробуйте какой-нибудь метод, но все еще работайте.
Показать ещё 4 комментария
Теги:

1 ответ

1
Лучший ответ

test (poll, req) является синхронной функцией, но внутри нее существует асинхронная ссылка на функцию User.findById(req.user). Один из вариантов - передать функцию обратного вызова


    test(poll,req, function(param){
        ... process return values from callback
        .... if case validations
    })

и назовите его


    var test = function(poll,req, cb){  
        User.findById(req.user._id,function(err, userFound){
            if(err){
                console.log("[checkVoted] Error findById");
            }
            ...for loop
            cb(param)
        }
    }

  • 0
    благодарю вас! я думаю, что это работает. я редактирую вопрос сейчас

Ещё вопросы

Сообщество Overcoder
Наверх
Меню