Async node.js:带回调的嵌套数组

时间:2018-01-18 09:26:58

标签: javascript arrays node.js express asynchronous

我有一个像这样的数组

var products = [
            {'id':1 ,items:['a','b']},
            {'id':2,items:['c','d']}
           ]

我想要的是循环遍历此数组并为items数组

执行数据库插入

例如没有异步

products.forEach((pdct) =>{

    pdct.items.forEach((item) => {
           calltoDb(item,function(result){
               console.log(item+'item inserted');
             })       
       });

});

我希望与async达成共识并在插入所有项目后获得结果

我需要使用eacheachSeries方法,我很困惑

3 个答案:

答案 0 :(得分:0)

eacheachSeries之间的区别在于eachSeries一次运行一次异步操作。因此,对于each,无法保证迭代函数将按顺序完成。

因此,如果您不需要像iteratee那样的订单,请更好地使用each,否则请使用eachSeries

示例:

import each from 'async/each'
let products = [
   {'id':1 ,items:['a','b']}
   , {'id':2, items:['c','d']}
   , {'id':3, items:['e','f']}
]
each(products, (product, callback) => {
   console.log(product)
   return callback()
})

可以返回

{'id':3, items:['e','f']}
{'id':1 ,items:['a','b']}
{'id':2, items:['c','d']}

<强> eachSeries:

import eachSeries from 'async/eachSeries'
let products = [
   {'id':1 ,items:['a','b']}
   , {'id':2, items:['c','d']}
   , {'id':3, items:['e','f']}
]
eachSeries(products, (product, callback) => {
   console.log(product)
   return callback()
})

它会返回

{'id':1 ,items:['a','b']}
{'id':2, items:['c','d']}
{'id':3, items:['e','f']}

答案 1 :(得分:0)

您不必使用外部库来在JavaScript中执行同步for循环,您只需使用async/await语法来执行此操作

看一下这个代码,逐个插入你的记录,等待每一个完成,直到跳到下一个。

async function insert() {
    var all_results = []
    for (var pdct of products) {
        for (var item of pdct.items) {
            var result = await new Promise(next => {
                calltoDb(item, res => next(res))
            })
            all_results.push(result)
        }
    }
    return all_results
}

insert().then(results => {
    console.log('Here u have all results', results)
}) 

答案 2 :(得分:0)

如果你宣传该回调,你可以使用Promise.all完成这项工作,它会包装一个Promises数组,并在数组中的每个Promise结算后解析。

Promise.all(products.map(product => {
    return Promise.all(product.items.map(item => {
        return new Promise(resolve => {
            calltoDb(item, resolve)
        })
    }))
})).then(results => {
    console.log(results)  // item results are in a nested array:
                          //     [['a','b'],
                          //      ['c', 'd']]
})

如果您使用的是Node 8,您还可以删除.then并使用await关键字代替:

const results = await Promise.all(products.map(product => {
    return Promise.all(product.items.map(item => {
        return new Promise(resolve => {
            calltoDb(item, resolve)
        })
    }))
}))