MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Làm cách nào để lồng một lời hứa bên trong một hàm hứa hẹn khác trong node.js?

Bao quanh toàn bộ vấn đề bằng một new Promise cuộc gọi không giúp được gì cả. Bên trong nó, bạn vẫn có địa ngục gọi lại. Và không, ném Promise.resolve() tại một hàm không trả về bất kỳ thứ gì cũng không giúp được gì.

Bạn sẽ cần phải quảng bá các nguyên thủy không đồng bộ, tức là các phần nhỏ nhất không đồng bộ. Trong trường hợp của bạn, đó là distance.matrixconnect của 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();
                });
        });
    });
}

Bây giờ chúng tôi có những thứ đó, chúng tôi thực sự có thể sử dụng chúng và kết hợp những lời hứa của chúng tôi thành những gì bạn thực sự đang tìm kiếm:

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. So sánh hai mảng đối tượng và kiểm tra xem chúng có các phần tử chung không

  2. Cách định dạng số trong SQL

  3. Nhận phần tử được chèn cuối cùng từ mongodb trong GoLang

  4. Lỗi giao dịch PyMongo:Số giao dịch chỉ được phép trên một thành viên hoặc mongos đặt bản sao

  5. Sự khác biệt giữa com.mongodb.client.MongoClient và com.mongodb.MongoClient