同时迭代两个相同长度

时间:2017-09-26 17:34:56

标签: node.js asynchronous concurrency

我有两个相同长度的迭代,我需要同时循环。一个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...
}

2 个答案:

答案 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
   });