2017-09-26 84 views
0

我有兩個相同長度的迭代,我需要同時循環。一個迭代是自定義對象的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]) 
} 

通常遍歷數組異步並同時我用藍鳥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... 
} 

回答

1

,如果你已經知道了,那地圖(我假設你真的是JavaScript的地圖在這裏,這是有序的)和數組的長度相同,則不需要映射功能,這既考慮數組和地圖。其中之一就足夠了,因爲地圖功能還給你一個索引值:

var map; 
var arr; 
Promise.map(map, (mapElem, index) => { 
    let customObj = mapElem[1]; 
    customObj.setValue(arr[index]); 
}); 
+0

這是完美的!在Promise.map文檔中忽略了這一點。萬分感謝! –

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 
    }); 
+0

我用藍鳥來加速!我需要同時循環兩個對象。我定義了一個自定義對象,並且該映射由許多這些自定義對象組成。我需要調用的幫助函數是該對象實例的成員函數,因此每次我調用它時,都會編輯該對象的特定實例。讓我知道你是否需要更多的澄清。 –