了解异步语句的变量范围

时间:2012-01-17 20:40:13

标签: javascript html5 web-sql

当我执行以下操作时:

for (var CurrentRow=0;CurrentRow < qryMfg.RecordCount;CurrentRow++){
    console.log(qryMfg.MFGID[CurrentRow]);
    dbo.transaction(function(myTrans) {
        console.log(qryMfg.MFGID[CurrentRow]);
    });
}

我按照我想要的方式获取MfgID列表,然后是未知因素列表,因为dbo.transaction正在异步执行。

如何将变量传递到dbo.transaction

2 个答案:

答案 0 :(得分:4)

在函数中创建变量范围,因此创建一个返回处理程序的函数...

function create_handler( scoped_row ) {
    return function(myTrans) {
        console.log(qryMfg.MFGID[scoped_row]);
    };
}

...并在循环中调用它,将它传递给任何你需要作用域的东西,在这种情况下,CurrentRow ......

for (var CurrentRow=0;CurrentRow < qryMfg.RecordCount;CurrentRow++) {
    console.log(qryMfg.MFGID[CurrentRow]);
    dbo.transaction( create_handler(CurrentRow) );
}

现在,每个处理程序都是在每次迭代中通过调用创建的相同唯一作用域中创建的。

由于CurrentRow已传递到该函数作用域,因此每个处理程序将通过scoped_row参数在其自己的作用域中引用唯一值。

当从函数返回处理程序时,它将被传递给dbo.transaction

即使它从创建它的函数中传出,它仍将保留其原始变量范围,因此始终可以访问scoped_row参数。


如果您愿意,也可以将整个操作放在函数中。

function create_transaction( scoped_row ) {
    console.log(qryMfg.MFGID[scoped_row]);

    dbo.transaction( function(myTrans) {
        console.log(qryMfg.MFGID[scoped_row]);
    });
}

...只要你传递CurrentRow ...

,就会有相同的结果
for (var CurrentRow=0;CurrentRow < qryMfg.RecordCount;CurrentRow++) {
    create_transaction( CurrentRow );
}

答案 1 :(得分:4)

for (var CurrentRow=0;CurrentRow < qryMfg.RecordCount;CurrentRow++) {
    console.log(qryMfg.MFGID[CurrentRow]);

    (function(row) {
        dbo.transaction(function(myTrans) {
            console.log(qryMfg.MFGID[row]);
        }); 
    })(CurrentRow);
}