Javascript JS中每个节点的顺序异步操作
我正在进行数据库迁移。这需要查询一个数据库,获取一个记录数组,并执行一组异步操作以将数据插入新的数据库。为了保持数据一致性,我希望一次插入一条记录,以便每个操作都按顺序运行。我发现实现这些的唯一方法是使用递归 有没有更干净的方法来做同样的事情?我知道有一个名为async的库,我以前从未尝试过 我编写的递归方法如下所示:Javascript JS中每个节点的顺序异步操作,javascript,asynchronous,async.js,Javascript,Asynchronous,Async.js,我正在进行数据库迁移。这需要查询一个数据库,获取一个记录数组,并执行一组异步操作以将数据插入新的数据库。为了保持数据一致性,我希望一次插入一条记录,以便每个操作都按顺序运行。我发现实现这些的唯一方法是使用递归 有没有更干净的方法来做同样的事情?我知道有一个名为async的库,我以前从未尝试过 我编写的递归方法如下所示: const insertItem = async (data) => { let item = data[0]; if (!item) {
const insertItem = async (data) => {
let item = data[0];
if (!item) {
//I am done return
return;
}
try {
//Do multiple await calls to insert record into new database
} catch (e) {
//Recover from error (DB rollbacks, etc)
} finally {
//Remove inserted or failed item from collection.
data.shift();
await insertItem(data);
}
};
//Query original database
getInfo().then((data) => insertItem(data));
您可以使用sync loop
for…of
它将等待HTTP响应
const dataArr = ['data1', 'data2', 'data3'];
async function processItems(arr){
for(const el of arr) {
const response = await insertData(el);
// add some code here to process the response.
}
};
processItems(dataArr);
发布的代码通过使用
data.shift
在调用递归处理所有内容的单个函数之前,对参数数组进行变异,从而实现对从第一个数据库检索到的数据集合(数组)的迭代
要解决此问题,请通过将数据处理函数拆分为两个来删除shift
和递归调用:
- 一个函数,用于逐步浏览从第一个数据库检索到的数据
- 根据需要在第二个数据库中插入记录的第二个函数
.finally
子句的需要,并使代码的结构看起来更像
async function insertData(data) {
for( let index = 0 ; index < data.length; ++index) {
await insertItem( data[index]);
}
}
async function insertItem( data) {
try {
//Do multiple await calls to insert record into new database
} catch (e) {
//Recover from error (DB rollbacks, etc)
// throwing an error here aborts the caller, insertData()
}
}
getInfo().then( insertData).catch( /*... handle fatal error ...*/);
异步函数insertData(数据){
for(让索引=0;索引insertItem
可以声明为insertData
中的嵌套函数,以保持其外观整洁,insertData
可以编写为的匿名函数参数,然后在getInfo()
之后调用
当然,也可以通过其他方式顺序执行异步操作,但在async
函数中使用wait
可能是最简单的编码方法。为什么不直接循环数据呢?如果您想按顺序同步,只需等待promise解决,然后再转到下一条记录谢谢@traktor53。它确实有意义,而且比我的原始代码要好得多。不过我相信xMayank发布的内容看起来更简单。谢谢你们两位!!!