पूरी चीज़ को एक new Promise
. से घेरना कॉल कुछ भी मदद नहीं करता है। इसके अंदर, आपके पास अभी भी कॉलबैक नरक होगा। और नहीं, फेंकना Promise.resolve()
एक समारोह में जो कुछ भी वापस नहीं करता है वह भी मदद नहीं करता है।
आपको वादा करना
करना होगा अतुल्यकालिक आदिम, यानी सबसे छोटे हिस्से जो अतुल्यकालिक हैं। आपके मामले में, वह distance.matrix
है और मोंगो का connect
+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();
});
});
});
}
अब जब हमारे पास वे हैं, तो हम वास्तव में उनका उपयोग कर सकते हैं और अपने वादों को उस चीज़ में मिला सकते हैं जिसे आप वास्तव में खोज रहे हैं:
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
});
}));