Я пытаюсь сделать эту функцию соответствующим обратным вызовом. Как уже было написано, обратный вызов будет вызываться дважды - один раз для синхронного оператора "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();
}
}
})
})
};
Из комментариев и вопросов, составлен код здесь. Используйте асинхронный модуль и функцию 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();
});
})
};