sql >> Database teknologi >  >> NoSQL >> MongoDB

Hvordan indlejrer jeg et løfte i en anden løftefunktion i node.js?

Omgiver det hele med ét new Promise opkald hjælper ikke noget. Inde i den ville du stadig have tilbagekaldshelvede. Og nej, smider Promise.resolve() ved en funktion, der ikke returnerer noget, hjælper det heller ikke.

Du skal love de asynkrone primitiver, altså de mindste dele, der er asynkrone. I dit tilfælde er det distance.matrix og mongo's 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(); }); }); }); }

Nu hvor vi har dem, kan vi faktisk bruge dem og kombinere vores løfter til det, du rent faktisk leder efter:

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



  1. Logisk ELLER for to forskellige felter i $hvor forespørgsler i mongodb

  2. Design Redis database tabel som SQL?

  3. Laravel:Hvordan tjekker man Redis tilgængelighed?

  4. Hurtig måde at finde dubletter på indekseret kolonne i mongodb