-
Notifications
You must be signed in to change notification settings - Fork 10
/
index.js
111 lines (95 loc) · 2.54 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
'use strict';
var xhr = require('xhr');
var queue = require('d3-queue').queue;
module.exports = geocodemany;
function geocodemany(accessToken, throttle) {
throttle = (throttle === undefined) ? 200 : throttle;
return function(list, transform, progress, callback) {
var q = queue(),
todo = list.length,
statuses = range(todo).map(function() {
return undefined;
}),
done = 0;
function range(n) {
var arr = [];
for (var i = 0; i < n; i++) arr.push(i);
return arr;
}
function error(err, callback) {
statuses[done] = false;
progress({
todo: todo,
done: ++done,
status: 'error',
statuses: statuses
});
setTimeout(function() {
callback(null, err);
}, throttle);
}
// forgive me
function copy(o) {
return JSON.parse(JSON.stringify(o));
}
function run(obj, callback) {
var str = transform(obj);
var output = copy(obj);
var options = {
uri: 'https://api.mapbox.com/geocoding/v5/mapbox.places/' + encodeURIComponent(str) + '.json?access_token=' + accessToken,
method: 'GET',
withCredentials: false
};
xhr(options, function(err, res) {
if (err) {
error({
error: new Error('Location not found'),
__iserror__: true,
data: output
}, callback);
}
var data = JSON.parse(res.body);
if (data && data.features && data.features.length) {
var ll = data.features[0];
output.longitude = ll.center[0];
output.latitude = ll.center[1];
statuses[done] = true;
progress({
todo: todo,
data: data ? data : {},
done: ++done,
status: 'success',
statuses: statuses
});
setTimeout(function() {
callback(null, output);
}, throttle);
} else {
error({
error: new Error('Location not found'),
__iserror__: true,
data: output
}, callback);
}
});
}
function enqueue(obj) {
q.defer(run, obj);
}
list.forEach(enqueue);
q.awaitAll(function(err, res) {
if (err) return callback(err);
callback(res
.filter(function(r) {
return r.__iserror__;
})
.map(function(r) {
delete r.__iserror__;
return r;
}),
res.filter(function(r) {
return !r.__iserror__;
}));
});
};
}