#javascript #angular
#javascript #angular
Вопрос:
Чего я пытаюсь достичь, так это:
— сначала выполняется обратный вызов и
— this.auth.javaAuthToken
, который является свойством в другом файле, инициализируется значением токена.
— после этого вызывается эта функция: return this.auth.getUserFiles();
Если я сделаю это:
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot):Observable<any> {
let token = null;
this.auth.emailListCleaningUserDetail().subscribe((res: any)=>{
token = res.body.data.access_token;
token = this.auth.javaAuthToken;
return this.auth.getUserFiles();
});
Затем я получаю сообщение об ошибке:
функция должна возвращать значение
Итак, я написал приведенный ниже код, чтобы проверить, существует ли токен. Если да, то я вызываю функцию и возвращаю.
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot):Observable<any> {
let token = null;
this.auth.UserDetail().subscribe((res: any)=>{
token = res.body.data.access_token;
token = this.auth.javaAuthToken;
console.log(token);
console.log('inside fun');
});
if(token) {
console.log('inside if outside fun');
this.auth.javaAuthToken = token;
return this.auth.getUserFiles();
}
console.log('outside if and fun')
}
}
Когда я запускаю программу,
— Сначала outside if and fun
печатается,
— затем печатается токен, и
— затем inside fun
печатается.
Комментарии:
1. привет, если ответ помог, пожалуйста, отметьте ответ 😉
Ответ №1:
Это довольно просто, когда вы пытаетесь получить доступ к токену (когда вы возвращаете свой результат), результат еще недоступен. В асинхронных функциях вам нужно либо дождаться значения, либо подписаться на событие.
Если вы подписываетесь на событие, вы можете получить доступ только к значению внутри подписки.
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot):Observable<any> {
let token = null;
this.auth.UserDetail().subscribe((res: any)=>{
token = res.body.data.access_token;
token = this.auth.javaAuthToken;
console.log(token);
console.log('inside fun');
// This is called when you receive your result which can be later as the code below as this is async
});
// token is always null because its declared as null before
// when this code runs, there is no result of your Service yet
if(token) {
console.log('inside if outside fun');
this.auth.javaAuthToken = token;
return this.auth.getUserFiles();
}
console.log('this runs right after the code before but the result is not available yet')
}
}
мне интересно, тоже ли это асинхронно:
this.auth.getUserFiles();
Затем вы могли бы сделать что-то вроде этого
LoadUserData = async event => {
var token = null;
var userfiles = null;
try {
var response = await this.auth.UserDetail()
if (response.data != null) {
token = response.data.access_token;
console.log('Receiving result: ' JSON.stringify(response.data));
}
} catch (error) {
console.log('ERROR: ' error)
}
try {
var responseUserFiles = await this.auth.getUserFiles();
if (responseUserFiles.data != null) {
// do something with your userfiles
userfiles = responseUserFiles.data;
console.log('Receiving result: ' JSON.stringify(responseUserFiles.data));
}
} catch (error) {
console.log('ERROR: ' error)
}
// Here you can return what you want, userfiles or token
return userfiles;
}
Ответ №2:
попробуйте это
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot):Observable<any> {
let token = null;
this.auth.UserDetail().subscribe((res: any)=>{
token = res.body.data.access_token;
token = this.auth.javaAuthToken;
console.log(token);
console.log('inside fun');
if(token) {
console.log('inside if outside fun');
this.auth.javaAuthToken = token;
return this.auth.getUserFiles();
}
});
console.log('outside if and fun')
}
}
Комментарии:
1.
return this.auth.getUserFiles();
должно быть возвращено вне обратного вызова, иначе это выдает ошибку, которую функция должна вернуть…