2017-01-20 9 views
0

まず、node.jsを使用してコントローラを作成しようとします。私はクエリのためのknexと、約束のためのQライブラリを使用しています。Node.js Qライブラリ:チェーンプロミス関数

私はチェーンにDBを照会するが、ここでエラーになってしまい非同期機能をしようとしている:

this.getPosts().then(this.getTags).then(function() ...

私だけthis.getPosts()のみthis.getTags()をすれば、それはそれらを正しく取り出します。

read機能はルートからのものです。

var db = require('../db'); 
var Q = require("q"); 

class IndexController { 
    constructor(page, data) { 
     this.page = page; 
     this.data = data; 
    } 

    getTags(){ 
     var deferred = new Q.defer(); 
     db('tags').select().then(function(tags){ 
      this.data.tags = tags; 
      deferred.resolve(); 
     }.bind(this)); 
     return deferred.promise; 
    } 

    getPosts(){ 
     var deferred = new Q.defer(); 
     db('posts').select('*', 'posts.id as id', 'tags.name as tag') 
     .innerJoin('users', 'posts.user_id', 'users.id') 
     .leftJoin('post_tags', 'posts.id', 'post_tags.post_id') 
     .leftJoin('tags', 'post_tags.tag_id', 'tags.id') 
     .then(function(posts){ 
      this.data.posts = posts; 
      deferred.resolve(); 
     }.bind(this)); 
     return deferred.promise; 
    } 

    read(res){ // <-- FROM ROUTE 
     this.getPosts().then(this.getTags).then(function(){ 
      res.render(this.page, this.data); 
     }.bind(this)); 
    } 

    ... 

} 
+0

こんにちは@フロスティ、何のエラーがありますか?そして、私はPromiseコンストラクタを使って約束を作ることができる約束のためにQライブラリを使っているのだろうかと疑問に思っています。 –

答えて

0

knexはすでにPromiseを使用していますので、qを使用する必要はありません。ちょうどそれを返す。

var db = require('../db'); 

class IndexController { 
    constructor(page, data) { 
     this.page = page; 
     this.data = data; 
    } 

    getTags() { 
     return knex('tags').select().then(function(tags) { 
      this.data.tags = tags; 
      return tags 
     } 
    } 

    getPosts() { 
     return knex('posts').select('*', 'posts.id as id', 'tags.name as tag') 
      .innerJoin('users', 'posts.user_id', 'users.id') 
      .leftJoin('post_tags', 'posts.id', 'post_tags.post_id') 
      .leftJoin('tags', 'post_tags.tag_id', 'tags.id') 
      .then(function(posts) { 
       this.data.posts = posts; 
       return posts 
      } 
    } 

    read(res) { // <-- FROM ROUTE 

    } 

    ... 

} 
+0

'read'関数を同じままにしますか? '未処理の拒否TypeError:未定義の[データを取得]のプロパティ 'data'を読み取ることができません。 – frosty

+0

ここで' this'を使用するには、プロミスチェーンの前に 'Promise.bind(this)'を使用する必要があります。 –

+1

NVM、それを持っています。ありがとう! – frosty