MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Jak zagnieździć obietnicę wewnątrz innej funkcji obietnicy w node.js?

Otoczenie całości jedną new Promise telefon nic nie pomaga. Wewnątrz nadal będziesz miał piekło oddzwaniania. I nie, rzucam Promise.resolve() w funkcji, która nic nie zwraca, też nie pomaga.

Musisz obiecać prymitywy asynchroniczne, czyli najmniejsze części, które są asynchroniczne. W twoim przypadku jest to distance.matrix i 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();
                });
        });
    });
}

Teraz, gdy już je mamy, możemy ich użyć i połączyć nasze obietnice z tym, czego naprawdę szukasz:

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. Jak zapisać plik w MongoDB?

  2. Djongo ArrayField „Przedmiot” nie podlega indeksowaniu

  3. zapytanie mongo :znajdź liczbę tablic we wszystkich dokumentach kolekcji

  4. Jak przekonwertować mongodb ISODate na ciąg w mongoDB?

  5. Przechowywanie milionów obrazów