2017-05-31 5 views
-1

私はNodeJSとJade/PUGを初めて使うので、これはあなたの多くにとって本当に簡単な質問かもしれませんが、私にとっては、 「プロミス」という言葉とそれがどのように機能するのかは、私にとって少し「混乱している」ため、インターネットからの回答が得られます。 私は、テーブルからいくつかの値を得るためにpostgreデータベースに問い合わせています(本当に単純なクエリ)。私が約束を使わずにこれを行うと、コンソールが結果を出力し、誰もが満足しています。しかし、この結果を変数に格納して、それをJadeテンプレートのパラメータとして渡すと、変化します。ノード&ジェイドで約束の結果を得るにはどうすればいいですか

これを実行するには、変数にアクセスしているときに値がまだ解決されていない可能性があり、それが約束を使用している可能性が高いということを読んでいます。だからここに私は私のコードを持っている:

hero.js

getHeroes: function() 
{ 
    //Initialize array 
    var elem = []; 
    console.log('Querying heroes'); 
    return new Promise((resolve, reject) => 
    { 

     pg.connect(conString, function (err, client, done) 
     { 
      if (err) 
      { 
       return console.error('error fetching client from pool', err) 
      } 
      //Execute SELECT query 
      client.query('SELECT name from heroe;', function (err, rows, result) 
      { 
       //Iterate over results 
       for (var i = 0; i < rows.rowCount; i++) 
       { 
        //PUSH result into arrays 
        elem.push(rows.rows[i].name); 
       } 
       done() 
       if (err) 
       { 
        return console.error('error happened during query', err) 
       } 
       resolve(elem) 
      }) 
     }); 

    }) 

} 

そして、この私がその関数を呼び出して、私のserver.jsの一部:

app.get('/jade', (request, response) => { 
var heroList = []; 
heroList = hero.getHeroes(); 
console.log(heroList); 
response.render('test_jade', {param1: 'test'}); 
}) 

にconsole.log 「Promise {pending}」と表示され、解決済みのイベントを聞いて、それが終了したら値を取得する方法がわかりません。

アドバイス/解決策、あるいはNode.jsのマニュアルもありがとうございました。私のような全面的な初心者のためにこのすべての混乱が説明されています。

ありがとうございます!

答えて

2

これはあなたの約束をどのように使用するかではありません。

app.get('/jade', (request, response) => { 
    var heroList = []; 
    hero.getHeroes().then(data=>{ 
     heroList = data; 
     console.log(heroList); 
     response.render('test_jade', {param1: 'test'}); 
    }).catch(e=>{ 
     //handle error case here when your promise fails 
     console.log(e) 
    }) 
}) 

あなたはずもcatch場合、あなたの約束が失敗し、これを試してみてください。

+0

くそー!それは私が探していたものです。「それから」「約束がいつ解決されたかを教えてください」私は私の質問で話していましたが、素早く答えていただきありがとうございましたanuragasaurus。私はプロミスが解決するのを待って玉のビューをロードするとNodeJSの "非同期の精神"に違反していますか? – Ejher

+0

@エージャーあなたの疑問は何ですか? – nrgwsth

+0

私はイントロを前に押しましたプロミスが解決するのを待ってから、玉のビューを読み込むと、NodeJSの "非同期の精神"に違反していますか? " – Ejher

関連する問題