Javascript JS中每个节点的顺序异步操作

Javascript JS中每个节点的顺序异步操作,javascript,asynchronous,async.js,Javascript,Asynchronous,Async.js,我正在进行数据库迁移。这需要查询一个数据库,获取一个记录数组,并执行一组异步操作以将数据插入新的数据库。为了保持数据一致性,我希望一次插入一条记录,以便每个操作都按顺序运行。我发现实现这些的唯一方法是使用递归 有没有更干净的方法来做同样的事情?我知道有一个名为async的库,我以前从未尝试过 我编写的递归方法如下所示: const insertItem = async (data) => { let item = data[0]; if (!item) {

我正在进行数据库迁移。这需要查询一个数据库,获取一个记录数组,并执行一组异步操作以将数据插入新的数据库。为了保持数据一致性,我希望一次插入一条记录,以便每个操作都按顺序运行。我发现实现这些的唯一方法是使用递归

有没有更干净的方法来做同样的事情?我知道有一个名为async的库,我以前从未尝试过

我编写的递归方法如下所示:

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发布的内容看起来更简单。谢谢你们两位!!!