【问题标题】:How to save several JSON data objects with Async tasks如何使用异步任务保存多个 JSON 数据对象
【发布时间】:2019-03-26 00:22:08
【问题描述】:

我从服务器获取了几个数组形式的 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();
        }
    });
}
}
}

【问题讨论】:

    标签: javascript node.js json asynchronous mongoose


    【解决方案1】:

    我发现对我有用的解决方案是使用 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() 检查数据库中的当前数据并创建一个新的 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({...}); 之间的速度差异。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 2019-10-02
      • 2015-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多