sql >> Databáze >  >> NoSQL >> MongoDB

Jak vnořím slib do jiné funkce slibu v node.js?

Celé to obklopuje jeden new Promise volání nic nepomůže. Uvnitř byste stále měli peklo zpětného volání. A ne, vyvoláním Promise.resolve() nepomůže ani funkce, která nic nevrací.

Budete muset slíbit asynchronní primitiva, tedy nejmenší části, které jsou asynchronní. Ve vašem případě je to distance.matrix a 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();
                });
        });
    });
}

Nyní, když je máme, můžeme je skutečně použít a spojit naše sliby do toho, co skutečně hledáte:

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. Jak se dotazovat na vnořené objekty?

  2. podmnožina dotazu mongodb pole

  3. MongoError:připojte ECONNREFUSED 127.0.0.1:27017

  4. Žádná odezva po připojení z celeru k redis přes ssl