4

データベースから行をクエリし、行ごとにいくつかの情報を処理してから、各行を結果で更新する必要があります。

これは、各行をループしてラベルを更新することを目的としたコード例です。

var mysql = require('mysql');

var db = mysql.createConnection(config.database);

db.connect(function() {
    db.query('SELECT id FROM testTable', function (err, rows) {
        if (err) {
            console.log(err);
        } else {
            if (rows.length) {
                for (var i = 0, len = rows.length; i < len; i++) {
                    var row = rows[i];
                    console.log(row);

                    var label = "Label_"+row.id;

                    db.query('UPDATE testTable SET label = ? WHERE id = ?', [label, row.id], function(err, result) {
                        if (err) {
                            console.log(err);
                        } else {
                            console.log("Set label on row %s", row.id);
                        }
                    })
                }
            }
        }
    })
});

これの出力は次のとおりです。

{ id: 1 }
{ id: 2 }
{ id: 3 }
{ id: 4 }
Set label on row 4
Set label on row 4
Set label on row 4
Set label on row 4

ご覧のとおり、4 行を 1 回ずつではなく、4 行を 4 回更新しました。新しいクエリはノンブロッキングですが、クエリごとに値が変わると思いました。

使用するコードを変更して、rows.forEach(function(){...})各 UPDATE を次々に実行できることはわかっています。それで問題ありません。しかし、私の理解を助けるために、非同期で更新を正しく実行する方法を知りたいです。

4

1 に答える 1