2016-03-21 27 views
0

Bazı sözleri zincirlemeye çalışıyorum, ancak kavramları anlamada sorun yaşıyorum.Javascript Promise Chain - ES6

Veritabanından bazı verileri yalnızca satır sayısı seçilen bir miktardan daha az olduğunda döndürmeye çalışıyorum, aksi halde bir hata döndürür.

fetchDataPoints(dataset,fields,startTimestamp,endTimestamp){ 

     let self = this; 
     let queryBody = " FROM [bi].[" + dataset + "] " + 
      "WHERE [timestamp] >= '" + startTimestamp.format("YYYY-MM-DD HH:mm:ss") + "' " + 
      "AND [timestamp] < '" + endTimestamp.format("YYYY-MM-DD HH:mm:ss") + "' " ; 


     let rowCountCheck = new Promise(function(resolve,reject) { 
      let request = new self.sql.Request(); 

      let rowCheckQueryString = "SELECT COUNT(*) AS row_count " + queryBody; 
      request.query(rowCheckQueryString).then(function(recordSet){ 
       if (recordSet[0].row_count > self._rowLimit) { 
        reject("Too many rows"); 
       } else { 
        resolve(); 
       } 
      }); 
     }); 

     let request = new self.sql.Request(); 

     let fieldsString = "[timestamp],[etl_timestamp]"; 
     for(let i = 0; i < fields.length; i++){ 
      fieldsString += ",[" + fields[i] + "]"; 
     } 
     let resultQueryString = "SELECT " + fieldsString + queryBody + " ORDER BY [timestamp] DESC"; 
     let resultQuery = request.query(resultQueryString); 

     return rowCountCheck.then(resultQuery); 

    } 

Ancak bu beklenen şekilde çalışmıyor:

Şimdiye kadar şöyle bir söz veri almaya ve döndürmek için bir yöntem var. Promises'e daha aşina olan biri bu tür bir şey için nasıl kullanılacağını açıklığa kavuşturabilir mi?

+0

[ 'Promise' yapıcı antipattern] kaçının (http://stackoverflow.com/q/23803743/1048572)! request.query (…) 'zaten bir söz vermiş görünüyor. – Bergi

+0

"Geri" argümanı olarak bir geri arama işlevi, söz değil, geçmelisiniz. – Bergi

+0

request.query (...) bir söz vermez ve bir söz geri vermek istiyorum. Bu nasıl olur? İlk sorgudan satır sayımı çok yüksek olduğunda reddetme vaadini isterim. –

cevap

2

Onun yerine bir çağrı geri fonksiyonu olarak kullanmak, request.query dönebilirsiniz:

return rowCountCheck.then(function(response){ 
     let request = new self.sql.Request(); 
     let fieldsString = "[timestamp],[etl_timestamp]"; 

     for(let i = 0;i < fields.length; i++){ 
      fieldsString += ",[" + fields[i] + "]"; 
     } 

     let resultQueryString = "SELECT " + fieldsString + queryBody + " ORDER BY [timestamp] DESC"; 

     return request.query(resultQueryString); 
}); 
` 
+0

Bu iyi çalıştı. –