[英]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
实现相同的效果并在插入所有项目后获得结果
我需要用哪一个each
或eachSeries
方法,我与它混淆
each
与each
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.