машинопись от обратного вызова до функции

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, как я могу вернуть значение обратно из функции callback? Есть ли способ, кроме одного обратного вызова? Или машинописный текст, обеспечивающий одно и то же адское решение обратного вызова?

  • 1
    Если вы не можете сделать что-то в JS, вы не можете сделать то же самое в TS. Может быть, вы должны toArray в toArray обещаний.
Теги:

1 ответ

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'

}

Верните обещание

Есть несколько библиотек обещаний, наиболее популярными являются 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
 }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню