sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur kapslar jag ett löfte i en annan löftesfunktion i node.js?

Omger det hela av ett new Promise samtalet hjälper ingenting. Inuti den skulle du fortfarande ha återuppringningshelvete. Och nej, kastar Promise.resolve() en funktion som inte returnerar något hjälper inte heller.

Du måste lova de asynkrona primitiva, d. v. s. de minsta delarna som är asynkrona. I ditt fall är det distance.matrix och mongos 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 när vi har dem kan vi faktiskt använda dem och kombinera våra löften till det du faktiskt letar 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. Frågar intern arraystorlek i MongoDB

  2. Hur man går in i produktion med MongoDB - Topp tio tips

  3. Kommer en Mongo $nära att returnera dokument för vilka någon punkt i en MultiPoint är inom räckhåll?

  4. MomentJS konverterar inte datum korrekt