sql >> データベース >  >> NoSQL >> MongoDB

node.jsの別のpromise関数内にpromiseをネストするにはどうすればよいですか?

    全体を1つのnewPromiseで囲みます 電話は何の役にも立たない。その中には、まだコールバック地獄があります。いいえ、 Promise.resolve()をスローします 何も返さない関数でも役に立ちません。

    約束 する必要があります 非同期プリミティブ、つまり非同期である最小の部分。あなたの場合、それは distance.matrix とmongoのconnect +挿入

    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. mongodbのネストされたオブジェクトのフィールドを更新する方法は?

    2. node-mongodb-native:アプリケーションを介して接続コールバックのdbapiオブジェクトを共有するにはどうすればよいですか

    3. MongoDBデータベースの暗号化

    4. マングース:モデルの配列をループしてデータを検索する