2016-12-19 5 views
1

mean.jsというエンドポイントで配列内で複数のクエリを実行すると、すべてのクエリを実行して1つの約束しか返しません。マップを使用しています各回答を作成し、最後にすべての約束の結果をpromise.allで返信したいと思います。Promise.Allはnode.jsで複数の約束事を定義するときにデータを返しません

var db = require(path.resolve('sequelize')); 

exports.runQueries= function (req, res, queries) { 

    // queries os an array 

    var runQueries = function(query){ 
    return new Promise(resolve => db.sequelize.query(query, { type: db.Sequelize.QueryTypes.SELECT })); 
    }; 

    var actions = queries.map(runQueries); 

    Promise.all(actions).then(function(data){ 
    res.send(data); 
    }); 

}; 

問題は)各約束は保留状態とPromise.all(であるということである。そして、来ることはありません。

答えて

0

Promise(機能)を誤用しています。それが受け入れるコールバックは、resolverejectのパラメータを受け入れるコールバックです。そのコールバックの戻り値は何にも使われません。しかし、それはthenコールバックのようなものです。

db.sequelize.queryすでに約束を返し、あなたが***行参照、別の1でそれをラップする必要はありません。

var db = require(path.resolve('./config/lib/sequelize')); 

exports.runQueries= function (req, res, queries) { 

    // queries os an array 

    var runQueries = function(query){ 
    // *** Just return the promise 
    return db.sequelize.query(query, { type: db.Sequelize.QueryTypes.SELECT }); 
    }; 

    var actions = queryFn.map(runQueries); 

    Promise.all(actions).then(function(data){ 
    res.send(data); 
    }); 

}; 

、もちろん、はるかに簡単になります

var db = require(path.resolve('./config/lib/sequelize')); 

exports.runQueries= function (req, res, queries) { 

    // queries is an array 

    var actions = queries(query => db.sequelize.query(query, { type: db.Sequelize.QueryTypes.SELECT })); 

    Promise.all(actions).then(data => { 
    res.send(data); 
    }); 
}; 

サイドノート:Promise.allコールバックのdataですrrayの結果はdb.sequelize.queryの解決済みです。その配列をres.send()に直接渡すことはできますか?

+0

@ tj-crowderありがとう、この仕事の完璧な、唯一の些細なこと、すべての応答がオブジェクトの配列として返されます、配列の1つの配列を取得しています、どのように配列のすべての要素すべての応答の? – Resc6356

+0

@ Resc6356:配列の配列から単一の配列を作成する方法を検索します(「concat」と「flatten」は便利な検索用語です)。 –

関連する問題