数据在函数中使用之前发生变化

Data changing before it's used in function

我一直在尝试为数据库中的每张过期票发送一封电子邮件。它的片段看起来像这样:

for (var i = 0; I < rows.length; ++i) {
    if (today > new Date(rows[i].end_date)) {
        (function(id) {
            db.exec('update tickets ' +
                    'set status="expired" ' +
                    'where ticket_id= ' + id + ';' +
                    'insert into changes ' +
                    'values(' + id + ',' +
                        '"system",' +
                        '"ticket expired",' +
                        '"' + (today.getUTCMonth() + 1) +
                        '/' + today.getUTCDate() +
                        '/' + today.getUTCFullYear() +
                    '");',
                    function(err) {
                        if (err) {
                            console.log(err);
                            return;
                        }

                        console.log(id);
                        sendAlert(id);
                    }
            );
        })(rows[i].ticket_id);
    }
}

如您所见,我尝试使用匿名函数来防止每次调用中的数据发生变化,但它仍然不起作用。

不知道是不是漏了什么

似乎这个任务的执行是异步的。当需要迭代异步调用时,操作顺序不保证

也许您需要一些控制流库,例如 Async or Promise。即使在迭代中,也有一些方法可以控制这些流程。