如何在Javascript中以正确的顺序input数据?

我正在使用Node.js发送一些数据到SQL Server表。 代码有一个for循环,它调用一个函数,它运行一个insert语句(最终将成为一个存储过程)。 按照date顺序,foor循环遍历一系列对象。 大多数情况下,插入语句以正确的顺序完成,但一些条目的顺序是错误的。

有什么方法可以确保数据库中的date顺序与我称之为的顺序相同(按时间顺序排列)。 我知道T-SQL中的SORT ,但是我认为程序应该按照正确的顺序来执行。 我一直听说尽可能避免线程睡眠和定时器,所以我不喜欢setTimeout的想法。 有没有另外一种方式,也许有事件处理?

下面的示例代码。 jsonArray一个元素是一个具有date键和其他几个数字的单个对象。 SQL Server表有一个自动增量的主键整数,我希望按时间顺序inputdate(就像我所说的那样),这样主键和date都是按顺序排列的。

我也使用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) }) } 

我假设它正在导致这种multithreading

这些数据库操作是asynchronous完成的,它们都发生在同一个线程上。 如果D1(第一个数据库操作)花费比D2(第二个数据库操作)更长的时间,并且在D2之后插入了D1(导致了问题),那么涉及multithreading的问题就不存在了,也许D2有更多的数据等等。

我会完全build议你不要使用波纹pipe代码示例,除非你确实相信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]) }