1

私が次のことをするとき:

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ですか?

4

2 に答える 2

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 );
}
于 2012-01-17T20:42:41.593 に答える
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);
}
于 2012-01-17T20:46:21.083 に答える