Я знаю, что задавались похожие вопросы. Но я объясню разницу.
У меня есть функция login(), которая должна возвращать User. Эта функция вызывает другую функцию, которая обращается к моему бэкэнду. Функция login() должна дождаться завершения обещания, прежде чем возвращать User. Проблема в том, что если я вставлю возврат в then(), он скажет:
[ts] A function whose declared type is neither 'void' nor 'any' must return a value.
Его необходимо вернуть, потому что вызывающей его функции потребуется JWT пользователя.
Упрощенный код:
login(user: User): User {
this.user = user;
//in between I fill some fields for the user
this.loginPromise().then(user => {
return user;
})
.catch(err => {
console.info(err);
//it doesn't make a difference wether I return a user here or not
}
loginPromise(): Promise<{}> {
var promise = new Promise(function(resolve, reject) {
this.restProvider.login(this.user)
.subscribe(result => {
const jwt = result.headers.get('JWT');
const config = { ... result.body };
if (config['result'] != 'failed'){
this.user.$JsonWebToken = jwt;
this.user.$passwordIsValid = true;
this.user.$usernameIsValid = true;
resolve(this.user);
}
}, err => {
console.info("error: " + err);
reject(err);
});
})
return promise;
}





Если вы измените этот loginPromise(): Promise<{}> на что-то простое, вроде этого loginPromise(){, я думаю, он все равно возвращает значение
Функция login не может возвращать объект User напрямую, она должна возвращать объект Promise<User>, потому что она получает объект user асинхронно.
login(user: User): Promise<User> {
this.user = user;
//in between I fill some fields for the user
return this.loginPromise()
.catch(err => {
console.info(err);
});
}
Затем функция потребителя вызовет функцию login и использует .then для получения значения user, полученного с сервера.
this.login().then(
user => console.info(user);
)
вы не можете вернуться из .then, вариант, который вы можете использовать здесь, - использовать async await, но в этом случае ваша функция login вернет promise, поэтому вам нужно будет вызвать .then при входе в систему, когда вы вызовете функцию login
async login(user: User): Promise<User> {
this.user = user;
return await this.loginPromise();
}
это сработало! Кроме того, у потребителя я добавил еще один
.then(()=> { //do stuff });, чтобы код запускался только после завершения предыдущего бита.