Как сохранить несколько объектов данных JSON с помощью асинхронных задач - PullRequest
0 голосов
/ 22 октября 2018

Я получаю несколько объектов JSON в виде массива с сервера, и мне нужен способ сравнить их все с моей базой данных, чтобы определить, нужно ли мне создавать новый объект или нет.Однако из-за того, как асинхронные задачи работают, переменные, которые я использую, чтобы определить, находится ли объект уже в моей базе данных, всегда равны последнему объекту в массиве с сервера или не определены до того, как я достигну Collection.findOne({...});

Код:

for (var i = 0; i < elseArray.length; i++) {
    var tempArray = elseArray[i][0].split(' ');
    var month = getMonthFromString(tempArray[0]);
    var date = tempArray[1];
    var name = Name[i];
    var loc = "";
    if (elseArray[i][1].indexOf(':') != -1) {
        min = elseArray[i][1].substring(elseArray[i][1].indexOf(':') + 1, elseArray[i][1].indexOf(':') + 3);
    }
    if (elseArray[i][1].includes("p.m.")) {
        hour = parseInt(elseArray[i][1].substring(0, elseArray[i][1].indexOf('–')), 10) + 12;
    } else {
        hour = parseInt(elseArray[i][1].substring(0, elseArray[i][1].indexOf('–')), 10);
    }
    if (elseArray[i][2].replace(/\s/g, '') == "Event") {
        loc = "Blue House"
    } else {
        loc = "Red House"
    }
    Collection.findOne({
        Name: name,
        Loc: loc,
        "DateTime.Year": year,
        "DateTime.Month": month,
        "DateTime.Day": day
    }, function(err, CollItem) {
        if (err) {
            res.send("MongoDB Error: " + err);
            return false;
        }
        if (!CollItem) {
            var E = new Collection({
                Name: name,
                Loc: loc,
                Capacity: 0,
                Attendance: 0,
                DateTime: {
                    Year: year,
                    Month: month,
                    Day: day,
                    Hour: hour,
                    Min: min,
                    Sec: 0
                }
            });
            E.save();
        }
    });
}

if (elseArray[i].length == 4) {
    if (elseArray[i][3].replace(/\s/g, '') == "Event") {
        loc = "Blue House"
    } else {
        loc = "Red House"
    }
    Collection.findOne({
        Name: name,
        Loc: loc,
        "DateTime.Year": year,
        "DateTime.Month": month,
        "DateTime.Day": day
    }, function(err, CollItem) {
        if (err) {
            res.send("MongoDB Error: " + err);
            return false;
        }
        if (!CollItem) {
            var E = new Collection({
                Name: name,
                Loc: loc,
                Capacity: 0,
                Attendance: 0,
                DateTime: {
                    Year: year,
                    Month: month,
                    Day: day,
                    Hour: hour,
                    Min: min,
                    Sec: 0
                }
            });
            E.save();
        }
    });
}
}
}

1 Ответ

0 голосов
/ 22 октября 2018

Решение, которое я нашел, работало для меня, заключалось в том, чтобы использовать цикл for для циклического прохождения массива данных, а затем внутри цикла for вызывать метод, который проверяет, находятся ли данные на сервере или нет.

Код:

for (var i = 0; i < elseArray.length; i++) {
    var tempArray = elseArray[i][0].split(' ');
    var month = getMonthFromString(tempArray[0]);
    var date = tempArray[1];
    var name = Name[i];
    var loc = "";
    if (elseArray[i][1].indexOf(':') != -1) {
        min = elseArray[i][1].substring(elseArray[i][1].indexOf(':') + 1, elseArray[i][1].indexOf(':') + 3);
    }
    if (elseArray[i][1].includes("p.m.")) {
        hour = parseInt(elseArray[i][1].substring(0, elseArray[i][1].indexOf('–')), 10) + 12;
    } else {
        hour = parseInt(elseArray[i][1].substring(0, elseArray[i][1].indexOf('–')), 10);
    }
    if (elseArray[i][2].replace(/\s/g, '') == "Event") {
        loc = "Blue House"
    } else {
        loc = "Red House"
    }
    getQuery(name, loc, year, month, date, hour, min);

    if (elseArray[i].length == 4) {
        if (elseArray[i][3].replace(/\s/g, '') == "Event") {
            loc = "Blue House"
        } else {
            loc = "Red House"
        }
        getQuery(name, loc, year, month, date, hour, min);
    }
}

В цикле for просматривается массив данных с сервера, который я считываю в данных, сохраняю все в переменных, а затем вызываю getQuery(), который проверяет текущую базу данныхdata и создает новый объект JSON, если текущие данные не были найдены в базе данных.

getQuery() метод:

function getQuery()(name, loc, year, month, day, hour, min) {
Collection.findOne({
    Name: name,
    Loc: loc,
    "DateTime.Year": year,
    "DateTime.Month": month,
    "DateTime.Day": day
}, function(err, CollItem) {
    if (err) {
        res.send("MongoDB Error: " + err);
        return false;
    }
    if (!CollItem) {
        var E = new Collection({
            Name: name,
            Loc: loc,
            Capacity: 0,
            Attendance: 0,
            DateTime: {
                Year: year,
                Month: month,
                Day: day,
                Hour: hour,
                Min: min,
                Sec: 0
            }
        });
        E.save();
    }
});
}

В методе getQuery(), если объект найденчто соответствует name, loc, year, etc..., который передается ни в чем, не происходит, иначе данные сохраняются и хранятся в базе данных.

Короче говоря, я превратил Collection.findOne({...}); в его собственный метод, называемый getQuery(), чтобы обойтиразница в скорости между асинхронными задачами и Collection.findOne({...});.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...