繁体   English   中英

异步node.js:嵌套数组与回调

[英]Async node.js :nested array with callback

我有这样的数组

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方法,我与它混淆

eacheach eachSeries之间的区别在于, each eachSeries 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']}

您不必使用外部库来在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)
}) 

如果您承诺该回调,则可以使用Promise.all非常简单地完成此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)
        })
    }))
}))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM