我使用Node.js向Server表发送一些数据。代码有一个for循环,它调用一个函数,它运行一个insert语句(最终将是一个存储过程)。foor循环按日期顺序遍历一系列对象。大多数情况下,insert语句以正确的顺序结束,但有些条目的顺序是错误的。
是否有办法确保数据库中的日期顺序与我所称的顺序相同(按时间顺序)。我知道think中的SORT,但我认为程序应该按照正确的顺序执行。我一直听说只要有可能就避免线程休眠和计时器,所以我不喜欢使用setTimeout。还有其他方法吗,也许是通过事件处理?
下面的示例代码。jsonArray的一个元素是一个具有日期键和其他几个数字的对象。Server表具有一个自动递增的主键整数,我希望按时间顺序输入日期(就像我所说的那样),这样主键和日期都是有序的。
我还将MSSQL导入用于SQL操作。
// Main class
for (let j = 0; j < jsonArray.length; j++) {
let myObj = jsonArray[j]
WriteToDB.myWriteFunction(myObj)
}
// Different class
const sql = require('mssql')
let request = new sql.Request()
let query = (...)
function myWriteFunction () {
request.query(query) // Just the actual insert statement, no issue here
request.on('error', function (err) {
console.log('REQ ERROR')
console.dir(err)
})
// These dates are out of order, due to when the done event is triggered
request.on('done', function () {
console.log('QUERY RAN FOR ' + e1)
})
}发布于 2016-06-28 13:46:43
我假设是某种多线程导致了
这些数据库操作是异步完成的,它们都发生在同一个线程上。如果D1 (第一次数据库操作)比D2 (第二次数据库操作)花费更长的时间,并且在D2之后插入D1 (导致您的问题),那么它不是涉及多线程的问题,可能D2有更多的数据等等。
我完全建议您不要使用下面的代码示例,除非您真的相信sql中的顺序确实重要。req2只有在req1完成之后才能完成,等等。=>浪费时间
let jsonArray = [1,2,3,4];
if (checkArray(jsonArray)) {
createReq(jsonArray[0])
}
function createReq(req) {
new Promise((resolve, reject) => {
setTimeout(() => {
resolve();
jsonArray.shift();
console.log(req);
if (checkArray(jsonArray)) {
createReq(jsonArray[0])
}
}, 100)
})
}
function checkArray(arr) {
return (jsonArray && jsonArray[0])
}https://stackoverflow.com/questions/38061054
复制相似问题