2015-06-12 29 views
0

我使用MongoDB的驅動程序連接蒙戈:打字稿從回調返回到功能

public listUsers(filterSurname?:string):any { 

     if (this.connected) { 
      debug.log(this.db); 
      var results; 
      this.db.collection('userProfiles').find({}).toArray((err:Error, res:any[])=> { 
       if (err) return 'getting results error' 
       else { 
        results=res; 
        results = res; 
       } 
       return res; 
      }); 
     } 
     debug.log('sending results' + results); 
     if (results !== null) { 

      return results; 
     } 
     else return 'connection error'; 
     return 'db unknown error' 

    } 

功能陣列旁邊簽名:

toArray(callback: (err: Error, results: any[]) => any) : void; 

我不能改變singnature,我怎麼能返回值從回調函數? 除了一次回調之外,還有什麼辦法嗎?或者打字稿提供相同的回調地獄解決方案?

+1

如果你不能在JS做的事情,你不能做同樣的事情在TS的例子。也許你應該在承諾中封裝'toArray'。 – Paleo

回答

0

你試圖完成的是從異步進程(數據庫查詢)中返回一個同步結果。

您將需要實現處理異步結果的策略,這裏有幾個選項:

傳遞一個回調函數到listUsers

public listUsers(filterSurname?:string, 
    callback: (err: Error, results: any[])=>void):any { 
    if (this.connected) { 
     debug.log(this.db); 
     var results; 
     this.db.collection('userProfiles').find({}).toArray(callback); 
    } 
    debug.log('sending results' + results); 
    if (results !== null) { 

     return results; 
    } 
    else return 'connection error'; 
    return 'db unknown error' 

} 

返回一個承諾

很少有諾言libr白羊座在那裏,最流行的是Qbluebird

下面是使用Q

public listUsers(filterSurname?:string): Q.Promise<any[]> { 
    var defer = Q.defer(); // create the promise structure 
    if (this.connected) { 
    debug.log(this.db); 
    this.db.collection('userProfiles') 
     .find({}) 
     .toArray((err:Error, res:any[])=> { 
     if (err) { 
      // reject the promise 
      //  means something went wrong 
      defer.reject('getting results error'); 
     } else { 
      // resolve the promise 
      //  means here is the result of what 
      //  I promised I would give you 
      defer.resolve(res); 
     } 
     }); 
    } 
    return defer.promise; // return out the actual promise 
}