2016-09-13 44 views
0

我正在研究nodejs並儘可能地通過保持響應數據與控制器相同以便我不需要更改控制器邏輯來將模型回調轉換爲承諾。我需要使用回調,我知道在使用藍鳥時是一個糟糕的主意。使用一個函數的結果調用其他藍鳥承諾

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 
}); 

在上面的代碼中有一個checkifexists功能和創造功能,但是從控制器只能創建函數被調用,所以我的代碼,因此,但仍調整它看起來很凌亂。

這是正確的做法嗎?如果我需要連續調用一系列函數而又一個函數,那麼我可能會將一個函數的響應傳遞給另一個函數,等等。

+0

「*我需要使用回調*」 - 對不起,我沒有得到原因。你能詳細說明嗎? – Bergi

+0

你應該promisify'connection.query' – Bergi

+0

實際上代碼已經分解成控制器和模型,所以目前我只是想改變模型,承諾不是控制器部分有回調實現。 – Vibhas

回答

1

而不是手動處理回調,你應該使用asCallback。 Promise你的節點式連接的東西,並儘可能使用promise。

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,connection)或cb(err) – Vibhas

+0

@Vibhas'fromCallback',那麼mysql連接錯誤是如何自動處理的你所以你不需要每次寫出 – Bergi

+0

函數asCallback應該返回任何被拒絕的承諾,作爲控制器的回調,但它不會,它總是給我所回報的東西,所以它很難檢測到它是否是它的在控制器端被拒絕或解決 – Vibhas