javascript - 如何知道所有 JSON 对象都已被迭代?

标签 javascript jquery

我正在使用jquery和jquery mobile开发phonegap产品,场景是,当用户第一次登录时,我们同步所有数据,完成后我们将用户转发到另一个 View 。这些项目以 json 格式从服务器检索。这是我的代码的一部分。我已调用 Web 服务,响应以 JSON 对象形式返回 response变量。

$(response.data.module.registration).each(function(k,v){
    //insert into app's sqlite database
});

$(response.data.module.attendance).each(function(k,v){
    //insert into app's sqlite database
});

$(response.data.items.grocery).each(function(k,v){
    //insert into app's sqlite database
});

//and so on. There could be many rows in each loop above.

我的问题是如何知道所有行都已从循环中插入,以便我可以将用户转发到受限区域。

更准确地说,如何知道所有 JSON 对象都已迭代成功?

我尝试的是将计数器放入每个循环中,并检查所有计数器的总和是否等于我们正在迭代的总项目数。但这不起作用,因为在插入所有项目之前,所有计数器的总和都已可用。

编辑

这是我的辅助函数,它将记录插入到 sqlite 数据库中。这不起作用,用户在插入所有数据之前已登录。你能告诉我哪里错了吗

var sqlhelper = {
 insertJSONData:function(tablename,data,callback){
          var dfrd = $.Deferred(); 
          var fields=sqlhelper.separateFieldData(data,"field");
          var dataval=sqlhelper.separateFieldData(data,"value");
          sqlhelper.db.transaction(function(tx) {
            var sqlquery='INSERT INTO '+tablename+' ('+fields+') values('+dataval+')';
            console.log(sqlquery);
             tx.executeSql(sqlquery,[],function(tx,result){ 
                dfrd.resolve(result); 
                console.log('Success'); 
            },sqlhelper.errorCB);
              if(callback!=undefined){
                callback();
              }
          });

          return dfrd.promise(); 
    }
}

这是获取服务器响应的代码

function defObj1()
{
    if(typeof response.data.module.registration!="undefined"){
              $(response.data.module.registration).each(function(i,e){
                    var data = {
                                'reg_id':     e.reg_id,                                                       
                                'reg_name':  e.reg_name,                                                                   
                                'reg_desc':   e.reg_desc,                                                                           
                                'reg_status':    e.reg_status
                    };
                    sqlhelper.insertJSONData('tbl_registration',data);
                }); // end of each loop

    }
}

function defObj2()
{
    if(typeof response.data.items.grocery!="undefined"){
              $(response.data.items.grocery).each(function(i,e){
                    var data = {
                                'grocery_id':     e.grocery_id,                                                       
                                'item_name':  e.item_name,                                                                   
                                'item_qty':   e.item_qty,                                                                           
                                'item_unit_price':    e.item_unit_price
                    };
                    sqlhelper.insertJSONData('tbl_grocery',data);
                }); // end of each loop

    }
}


$.when(defObj1() ,defObj2()).done(function(a1,a2){
    //sync complete so login user
    doLogin();
})

谢谢

最佳答案

试试这个。 (已编辑)

var isValid = true, i = 0, sum, callback = function () {
    //if all inserting is successfully  it is called 
};

...

$(response.data.module.registration).each(function (k, v) {
    //insert into app's sqlite database
    var data = {
        'reg_id': e.reg_id,
        'reg_name': e.reg_name,
        'reg_desc': e.reg_desc,
        'reg_status': e.reg_status
    };
    sqlhelper.insertJSONData('tbl_registration', data, function (data) {
        if (!data) {
            isValid = false;
            sum++;
        }
        i++;//onSuccess function
        checkLast(i);//call this lastly method or each
    }, function () {
        i++;//onError function
    });
});
...
//other codes is identical logic

...

function checkLast(i) {
    if (i == sum) {
        callback();
    }
}

...

我已将 successCallbakerrorCallback 添加到您的 sqlhelper

var sqlhelper = {
    insertJSONData: function (tablename, data, successCallbak, errorCallback) {
        var dfrd = $.Deferred();
        var fields = sqlhelper.separateFieldData(data, "field");
        var dataval = sqlhelper.separateFieldData(data, "value");
        sqlhelper.db.transaction(function (tx) {
            var sqlquery = 'INSERT INTO ' + tablename + ' (' + fields + ') values(' + dataval + ')';
            console.log(sqlquery);
            tx.executeSql(sqlquery, [], function (tx, result) {
                dfrd.resolve(result);
                if (successCallback) {
                    successCallback(result);
                }
                console.log('Success');
            }, sqlhelper.errorCB);
            if (errorCallback) {
                errorCallback();
            }
        });

        return dfrd.promise();
    }
}

关于javascript - 如何知道所有 JSON 对象都已被迭代?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32308680/

相关文章:

javascript - 如何延迟 KO 结合直到加载外部模板?

php - Yii:如何将代码附加到 ListView 的分页事件?

php - PHP:显示来自Web服务的图像

jquery - 如何在 datepicker() 中设置默认选项

javascript - 当电缆与我的智能手机断开连接时,它会运行我的 React Native 应用程序的旧代码

javascript - 调用添加到函数原型(prototype)的函数

javascript - 重启后等待MongoDB准备就绪的正确方法是什么?

javascript - 我的自定义指令中未定义 Controller ngModel

javascript - 动态创建 google 图表并将其附加到在 jquery 中动态创建的 div

javascript - 加入和着色 TR