我有两个相同长度的迭代,我需要同时循环。一个iterable是自定义对象的Map,另一个是对象数组。我需要将数组的内容添加到Map中(通过一些辅助原型函数),最好是异步和并发。而且,两个容器基于它们的顺序彼此相关联。因此,数组中的第一个元素需要添加到Map中的第一个元素。
如果我要同步这样做,它会看起来像这样:
var map;
var arr;
for (var i = 0; i < arr.length; i++) {
// get our custom object, call its prototype helper function with the values
// in the array.
let customObj = map[i];
customObj.setValues(arr[i])
}
通常我会使用bluebirds Promise.map
来循环遍历数组异步并同步。它看起来像这样:
var arr
Promise.map(arr, (elem) => {
// do whatever I need to do with that element of the array
callAFunction(elem)
})
如果我可以这样做,那将是非常棒的:
var map;
var arr;
Promise.map(map, arr, (mapElem, arrElem) {
let customObj = mapElem[1];
customObj.setValue(arrElem);
})
有没有人知道图书馆或聪明的方法来帮助我实现这个目标?
感谢。
编辑:只想添加一些关于地图中存储的对象的说明。地图以唯一值为键,值与该唯一值相关联构成此对象。它的定义与此类似:
module.exports = CustomObject;
function CustomObject(options) {
// Initialize CustomObjects variables...
}
CustomObject.prototype.setValue(obj) {
// Logic for adding values to object...
}
答案 0 :(得分:1)
如果你已经知道,Map(我假设你真的是指这里的JavaScript Map,这是有序的)并且数组具有相同的长度,你不需要一个映射函数,它同时接受数组和映射。其中一个就足够了,因为map函数还为你提供了一个索引值:
var map;
var arr;
Promise.map(map, (mapElem, index) => {
let customObj = mapElem[1];
customObj.setValue(arr[index]);
});
答案 1 :(得分:0)
您可以使用执行所有给定异步函数的函数Promise.all
。
您应该知道node.js实际上完全支持Promises
,您不再需要bluebirds
。
Promise.all(arr.map(x => anyAsynchronousFunc(x)))
.then((rets) => {
// Have here all return of the asynchronous functions you did called
// You can construct your array using the result in rets
})
.catch((err) => {
// Handle the error
});