Я использую драйвер 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? Есть ли способ, кроме одного обратного вызова? Или машинописный текст, обеспечивающий одно и то же адское решение обратного вызова?
То, что вы пытаетесь выполнить, - это вернуть синхронный результат асинхронного процесса (запрос базы данных).
Вам нужно будет реализовать стратегию обработки асинхронных результатов, вот несколько вариантов:
Передать функцию обратного вызова в 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
}
toArray
вtoArray
обещаний.