3

クライアントは、同じ Web ページ内の 2 つのテーブルまたはリストに提供される動的な情報を要求します。たとえば、2 つのオブジェクトまたは記事を比較するとします。

翡翠のテンプレート

extends layout.jade

block content1
    div= foo_table
block content2
    div= bar_table

データベースクエリ

var table1 = db.query('select * from table where ...')
    .then(function (result){
        console.log(result);
    });

var table2 = db.query('select * from table where ...')
    .then(function (result){
        console.log(result);
    });

//I DON'T WANT TO SEND TO CONSOLE, JUST GET THE DATA, BUT IT IS ASYNCHRONOUS

console.logの代わりにreturnを使用しても、データのセットは返されません。

.then(function (result){
        return(result);
    });

No variable defined inside then() is persistent.

ルーターコード

この方法を使用すると機能しますが...:

router.get('/', function(req, res, next) {
    db.query('select * from table where ...')
    .then(function (result){
            res.send(result);
        });

問題は、1 つのクエリしか処理できないことです。

2 つのブロックを同時に提供したい:

router.get('/', function(req, res, next) {
    res.render('./index', { foo_table: table1, bar_table: table2});
};
  • 私が得る唯一の考えはconsole.logですが、クエリの結果をテンプレートに渡す方法はありません( varテーブルはクエリの結果を保存しません)。

  • 「then」または非同期関数内で作成した変数は永続的ではありません。

  • JSON.stringify または parse は、これらのネストされた関数の結果を変換しません。

  • テンプレート変数定義 (footable: *、bartable: *) の後で関数をコールバックしたり、関数を作成したりしても機能しません。

  • クエリは thenable であるため、保存可能なものに変換する方法を見つけることができません。代わりに、さまざまな thenable クエリから結果を収集して、最終的な情報を提供し、テンプレート変数をレンダリングします。

  • ページが読み込まれるときに、テーブルごとに個別の AJAX メソッドを作成する必要がありますか?

  • 最初から get メソッドでページ全体を提供したい。

4

1 に答える 1

1

Bluebird (または他の promise ライブラリ) のようなものを使用している (または使用しているライブラリが基づいている)場合は、次のように実行できるはずです。

Promise.all([
    db.query('select * from foo where ...'),
    db.query('select * from bar where ...')
])
.spread(function(foo, bar) {
    /* prepare data as you need them */
    res.render('./index', { foo_table: foo, bar_table: bar});
});

Promise.all渡された配列内の両方のメソッド (db クエリ) が終了して返されるまで非同期的に「待機」し、渡されたコールバックに両方の結果を一緒に渡します.spread()(この例のように)。

于 2015-08-06T19:04:02.527 に答える