我有一个像这样的数组
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
方法,我很困惑
答案 0 :(得分:0)
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']}
答案 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)
})
}))
}))