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

时间:2015-08-31 10:02:49

标签: javascript jquery

我正在使用jquery和jquery mobile处理phonegap产品,方案是,当用户第一次登录时,我们同步所有数据,完成后我们将用户转发到另一个视图。从服务器以json格式检索项目。这是我的代码的一部分。我调用了webservice,响应作为response变量中的JSON对象返回。

$(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 db中。这没有用,用户在插入所有数据之前都已登录。你能告诉我哪里出错了吗

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();
})

由于

1 个答案:

答案 0 :(得分:1)

试试这个。 (编者)

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();
    }
}