MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Как да вложа обещание в друга обещаваща функция в node.js?

Заобикаляйки цялото нещо с едно new Promise обаждането не помага нищо. Вътре в него все още ще имате ад за обратно извикване. И не, хвърляне на Promise.resolve() при функция, която не връща нищо, също не помага.

Ще трябва да promisify асинхронните примитиви, т.е. най-малките части, които са асинхронни. Във вашия случай това е distance.matrix и connect на mongo +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
    });
}));



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mongoose агрегиране с geonear

  2. mongoDB има ли проблеми с повторното свързване или го правя погрешно?

  3. Поправете „$pullAll изисква аргумент за масив, но получи двоен“ в MongoDB

  4. Твърде много отворени файлове, като същевременно осигурите индекс mongo

  5. Meteor.js версия на mongodb