如何使用异步任务保存多个 JSON 数据对象

Posted

技术标签:

【中文标题】如何使用异步任务保存多个 JSON 数据对象【英文标题】:How to save several JSON data objects with Async tasks 【发布时间】: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();
        
    );



【问题讨论】:

【参考方案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(...); 之间的速度差异。

【讨论】:

以上是关于如何使用异步任务保存多个 JSON 数据对象的主要内容,如果未能解决你的问题,请参考以下文章

如何运行多个异步函数然后执行回调?

如何使python对象json序列化?

如何在 Android 中使用异步任务通过数组列表更新列表视图?

如何在循环并进行异步承诺调用后获取重新格式化的 json 对象

如何使用 pySpark 使多个 json 处理更快?

如何使用Yii从数据库中的JSON帖子中保存多个项目