2015-06-12 3 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

То, что вы пытаетесь выполнить, - это вернуть синхронный результат асинхронного процесса (запрос базы данных).

Вам нужно будет реализовать стратегию для обработки асинхронных результатов, вот несколько вариантов:

Pass в функции обратного вызова в 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' 

} 

Возвращение обещание

Есть мало обещающих либер Овен там, наиболее популярными из которых Q и bluebird

Вот пример использования 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 
} 
Смежные вопросы