Цикл по массиву с последующим вызовом обратного вызова в конце будет работать, но его трудно прочитать и он может вызвать некоторые проблемы, поэтому я бы использовал здесь Promises:
const getCoords = geocoder => address => new Promise((resolve, reject) => {
address = [address.field2, address.field3, address.field4].join(" ");
geocoder.geocode(address, function(err, coords) {
if(err) reject(err) else resolve({ address, coords });
});
});
Так что теперь, чтобы получить определенную координату, вы можете просто сделать:
getCoords(NodeGeocoder(options))({field2: "Unknown Location"})
.then(({ address, coords }) => console.log(adress + " is at " + coords));
Теперь поймите, что с вашим CSV тоже легко:
csv({noheader:true})
.fromFile(csvFilePath)
.then(data => Promise.all(data.map(getCoords(NodeGeocoder(options)))
.then(positions => {
//...
})
И positions
теперь является массивом пар координат / адресов.
Если вы хотите использовать код, просто добавьте
const currAddress = addresses[i].field2 + ' ' + addresses[i].field3 + ' ' + addresses[i].field4;
чтобы держать его в закрытии, вы можете подтолкнуть его к результатам:
coords.push({ coords: results, address: currAddress });