Асинхронный обратный вызов функции mongodb

1

Я пытаюсь сделать эту функцию соответствующим обратным вызовом. Как уже было написано, обратный вызов будет вызываться дважды - один раз для синхронного оператора "if" и один для асинхронного оператора test2.save. Я помещаю встречный код в качестве примера, который я пробовал. Это не работает, поскольку инструкция bottom if является синхронной. Я уже знаю, что не так с этим кодом, но я понятия не имею, как сделать это лучше.

var postMatches = function(user1, userResults, callback) {
  User.find({}, {username: 1, testResults: 1}, (err, users) => {
    var counter = 0;
    users.forEach(function(user2){
      counter++;
      if(user1 !== user2.username && user2.testResults !== undefined) {
        var test1 = new Test({
          username: user1,
          match: user2.username,
          compatability: mbti[userResults][user2.testResults],
          alreadyMatches: false
        });

        test1.save( () => {
          var test2 = new Test({
            username: user2.username,
            match: user1,
            compatability: mbti[user2.testResults][userResults],
            alreadyMatches: false
          });

          test2.save( () => {
            if(counter === users.length) {
              callback();
            }
          });
        })
      } else {

        if(counter === users.length) {
          callback();
        }
      }
    })
  })
};
  • 0
    Какой у вас вариант использования? В основном то, что вы пытаетесь достичь? Что я могу получить, так это то, что у вас есть дБ пользователей, и вы пытаетесь сопоставить входного пользователя на основе некоторого параметра, можете ли вы объяснить немного.
  • 0
    Эта функция создает связь между двумя пользователями в коллекции Test. Мне нужны обратные вызовы в основном для проверки функции. Мне не нужны обратные вызовы для работы моего приложения, но я подумал, что это действительно интересная ситуация, и хотел услышать некоторые мысли по этому поводу.
Показать ещё 2 комментария
Теги:
mongoose

1 ответ

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

Из комментариев и вопросов, составлен код здесь. Используйте асинхронный модуль и функцию forEach для перебора списка пользователей и возврата обратного вызова после завершения. Читайте об async и forEach. Сообщите мне, если это работает для вашего случая использования.

var async = require('async')
var postMatches = function(user1, userResults, callback) {
  User.find({}, {username: 1, testResults: 1}, (err, users) => {
    var counter = 0;
    async.forEach(users,function(user2,iterate_callback){
      if(user1 !== user2.username && user2.testResults !== undefined) {
        var test1 = new Test({
          username: user1,
          match: user2.username,
          compatability: mbti[userResults][user2.testResults],
          alreadyMatches: false
        });

        test1.save( () => {
          var test2 = new Test({
            username: user2.username,
            match: user1,
            compatability: mbti[user2.testResults][userResults],
            alreadyMatches: false
          });

          test2.save( () => {
            iterate_callback();
          });
        })
      } else {
        iterate_callback();
      }
    },function(err){
      console.log("Done iterating");
      return callback();
    });
  })
};
  • 0
    Test2.save -callback должен вызывать iterate_callback, иначе forEach никогда не заканчивается?
  • 0
    Отредактировал ответ. Вы правильно поняли, человек :)
Показать ещё 1 комментарий

Ещё вопросы

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