for循环中的db.transaction

时间:2015-04-10 11:18:23

标签: jquery cordova phonegap-plugins cordova-3

我需要使用for循环的结果执行db.transaction。但是在db.transaction完成之前,循环会发生下一次迭代。

db.transaction(function(tx) {

tx.executeSql("select * from unassigned_item", [], function(tx, res) {
    var list = '';

    if (res != null && res.rows != null && res.rows.length>0) { 

        for (var i = 0; i < res.rows.length; i++) {
            var row = res.rows.item(i);
            var serial = row.serialno;
            var id = row.unassigned_itemid;
            var theSerialNo = row.serialno;

            tx.executeSql("select * from unassigned_item where serialno="+ serial + "", [], function(tx, res) {
                });

            if(row.serialno.indexOf("'")>-1){
                theSerialNo = theSerialNo.replace(/'/g,"\\'");
            }
            list = list + '<li data-icon="false"><a onClick="selectedSerialNo(\'' + theSerialNo + '\', +\'' +  id + '\');">' + theSerialNo + '</a></li>';
            //list = list + '<li data-icon="false"><a onClick="selectedSerialNo(\'' + theSerialNo + '\', +\'' +  id + '\');">' + serial + '</a></li>'
        }
    }
    //list = list + '<li data-icon="false"><a onClick="selectedSerialNo(\'NEW\', 0);">ADD_NEW</a></li>'
    $("#serial_suggestions li").remove();
    $("#serial_suggestions").append(list);

});
},function(){

},function(){


});

我怎么能实现这个?

1 个答案:

答案 0 :(得分:1)

db操作是异步的,因此如果您希望在上一次迭代完成之后完成下一次迭代,则不能在for循环中使用它。

你可以做的是使用变量作为计数器,并在executeSql的成功回调中检查它的值。

这样的事情(抱歉没有时间更深入地检查你的功能应该做什么):

db.transaction(function (tx) {
    tx.executeSql("select * from unassigned_item", [], function (tx, res) {
        var list = '';
        if (res != null && res.rows != null && res.rows.length > 0) {
            var i = 0;
            function iteration(i, rows) {
                var row = res.rows.item(i);
                var serial = row.serialno;
                var id = row.unassigned_itemid;
                var theSerialNo = row.serialno;
                tx.executeSql("select * from unassigned_item where serialno=" + serial + "", [], function (tx, res) {
                    if (row.serialno.indexOf("'") > -1) {
                        theSerialNo = theSerialNo.replace(/'/g, "\\'");
                    }
                    list = list + '<li data-icon="false"><a onClick="selectedSerialNo(\'' + theSerialNo + '\', +\'' + id + '\');">' + theSerialNo + '</a></li>';
                    i += 1;
                    if (i < rows.length)
                        iteration(i, rows);
                    else
                        theEnd();
                });
            }
            function theEnd() {
                $("#serial_suggestions li").remove();
                $("#serial_suggestions").append(list);
            }

            iteration(i, rows);
        }

    });
});