sql >> Database >  >> NoSQL >> MongoDB

Hoe nest ik een belofte in een andere beloftefunctie in node.js?

Het geheel omgeven door één new Promise bellen helpt niets. Binnenin zou je nog steeds een callback-hel hebben. En nee, het gooien van Promise.resolve() bij een functie die niets teruggeeft, helpt ook niet.

U moet beloven de asynchrone primitieven, d.w.z. de kleinste delen die asynchroon zijn. In jouw geval is dat distance.matrix en 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 we die hebben, kunnen we ze echt gebruiken en onze beloften combineren tot wat u werkelijk zoekt:

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. Memcached of Redis gebruiken op aws-elasticache

  2. MongoDB:verwijder de laatste twee tekens uit String

  3. Indexeren van array/subobject in mongoDB veroorzaakt dubbele sleutelfout

  4. Optimale samengestelde indexen voor $exists:true (dunne indexen)