Bao quanh toàn bộ vấn đề bằng một new Promise
cuộc gọi không giúp được gì cả. Bên trong nó, bạn vẫn có địa ngục gọi lại. Và không, ném Promise.resolve()
tại một hàm không trả về bất kỳ thứ gì cũng không giúp được gì.
Bạn sẽ cần phải quảng bá
các nguyên thủy không đồng bộ, tức là các phần nhỏ nhất không đồng bộ. Trong trường hợp của bạn, đó là distance.matrix
và connect
của mongo + insert
:
function getMatrix(m, o, d) {
return new Promise(function(resolve, reject) {
m.matrix(o, d, function(err, distances) {
if (err) reject(err);
else resolve(distances);
});
});
}
function save(url, store, k) {
// cramming connect+insert in here is not optimal but let's not get into unnecessary detail
return new Promise(function(resolve, reject) {
MongoClient.connect(url, function(err, db) {
if (err)
reject(err);
else
db.collection(k).insert(store, function(err, results) {
if (err) reject(err);
else resolve(results);
db.close();
});
});
});
}
Bây giờ chúng tôi có những thứ đó, chúng tôi thực sự có thể sử dụng chúng và kết hợp những lời hứa của chúng tôi thành những gì bạn thực sự đang tìm kiếm:
module.exports = Promise.all(dep.map(function(name) {
distance.departure_time(name);
return getMatrix(distance, origins, destinations).then(function(distances) {
if (!distances) throw new Error('no distances');
var promises = [];
if (distances.status == 'OK') {
for (var i=0; i < origins.length; i++) {
for (var j = 0; j < destinations.length; j++) {
var origin = distances.origin_addresses[i];
var destination = distances.destination_addresses[j];
if (distances.rows[0].elements[j].status == 'OK') {
var duration = distances.rows[i].elements[j].duration_in_traffic.value;
var myobj = {
destination: destination,
departure_time: name,
duration: duration
};
var str = destination.replace(/[,\s]+/g, '');
promises.push(save(url, myobj, str));
// ^^^^^^^^^^^^^^^^^^^^^
}
}
}
}
return Promise.all(promises); // now wait for all save results
});
}));