2016-09-13 15 views
0

私はnodejsに取り組んでおり、コントローラのロジックを変更する必要がないように、応答データをコントローラと同じに保つことによってモデルコールバックを約束しています。私は青い鳥と一緒に働いている間、私が知っているコールバックを使うのは悪い考えです。受け入れ答えサンプルコントローラコードに基づいbluebird約束で他の関数を呼び出すための結果を使用する

var functions={ 
       checkifexists:function(data){ 
       return new Promise(function(resolve,reject){ 
       // Query is fired here 
       resolve(data) or reject (data) 
       }); 
      }, 
      create:function(data,cb{ 
       mysql.getConnectionFromPool(function(err,connection){ 
       this.checkifexists(data,connection).then(function(res){ 
       if(res.count) 
       { 
        cb(res.count); 
       } 
       else 
       { 
        connection.query(insertsql,data,function(err,data){ 
         // Handle any error or return insertID 
          cb(null,insertID) 
        }); 
       } 
      }).catch(function(e){ 
       console.log(e); 
      }).finally(function(){ 
       connection.release(); 
      }); 
     });} 

sampleModel.create(req.body,function(err,result){ 
    console.log("Err : "+err); // Always Null 
    console.log("Result :"+result); // Always displays both reject and resolve cases 
}); 

上記のコードでは、そこに1つのcheckifexists関数であり、関数を作成するが、コントローラが機能のみを作成するから、いわゆる、私はそれに応じて、まだコードによって調整されますそれは乱雑に見えます。

これは正しい方法ですか?ある関数の呼び出しを別の関数に渡すなど、一連の関数を呼び出す必要がある場合はどうなりますか?

+0

「*私はコールバック*を使用する必要があります」 - 申し訳ありませんが、私はその理由を知りませんでした。あなたは精緻化できますか? – Bergi

+0

あなたも 'connection.query'を約束するべきです – Bergi

+0

実際にコードはコントローラとモデルに分解されているので、現在はコールバックが実装されているコントローラ部分ではないことを約束するようにモデルを変更したいだけです。 – Vibhas

答えて

1

コールバックを手動で処理する代わりに、asCallbackを使用する必要があります。ノードスタイルの接続を約束し、できる限りどこでも約束を使用してください。

var functions = { 
    getConnection: function() { 
     return Promise.fromCallback(mysql.getConnectionFromPool.bind(mysql)) 
     .disposer(function(connection) { 
      connection.release(); 
     }); 
    }, 
    checkifexists: function(data, connection) { 
     return new Promise(function(resolve,reject) { 
      // Query is fired here 
      resolve(data) or reject (data) 
     }); 
    }, 
    insert: function(data, connection) { 
     return Promise.fromCallback(connection.query.bind(connection, insertsql, data)); 
    }, 
    create: function(data, cb) { 
     return Promise.using(this.getConnection(), function(connection) { 
      return this.checkifexists(data, connection) 
      .then(function(res) { 
       if (res.count) { 
        throw res.count; // are you sure? 
       } else { 
        return this.insert(data, connection); 
       } 
      }.bind(this)) 
     }.bind(this)) 
     .asCallback(cb); // this is all you need 
    }); 
}; 
+0

あなたの答えはちょうど完全に機能しましたが、getConnectionFromPool()がcb(null、接続)またはcb(err)のいずれかを持っていれば、mysql接続エラーは自動的にどのように処理されるのか理解できませんでした – Vibhas

+0

@Vibhas 'fromCallback'あなたは毎回それを書く必要はありません – Bergi

+0

関数asCallbackは、私の間に拒否された約束を返すべきです。controolerへのコールバックとして、それはありません。拒否された、またはコントローラ側で解決されました – Vibhas

関連する問題