Я пытаюсь вернуть значение (строку) из функции, которая вызывает API с помощью rxjs. Переменная должна быть возвращена в полном предложении наблюдаемого.
Это код:
getToken(): any {
let token = '';
this.meService.getMe().subscribe(data => {},
err => {
let headers = new HttpHeaders();
headers = headers.set('Content-Type', 'application/x-www-form-urlencoded; charset=utf-8').set(InterceptorSkipHeader, '');
this.http.post(Configs.heroku + 'https://login.microsoftonline.com/common/oauth2/v2.0/token', 'grant_type=authorization_code&code=' + localStorage.getItem('refresh') + '&client_id=' + Configs.appId + '&redirect_uri=http://localhost:4200/redirect&' + 'client_secret=lkcqTNT730}zyoVLOX45)|;', {headers: headers}).subscribe(data => {
localStorage.setItem('access', data['access_token']);
token = localStorage.getItem('access');
});
},
() => {
return localStorage.getItem('access');
});
}
Как видите: я пытаюсь вернуть переменную в предложении complete. Однако он никогда не возвращает переменную. Когда я распечатываю его в вызывающей функции, он просто говорит undefined. Какие-нибудь решения?
Заранее спасибо!
редактировать:
Это та часть, где вызывается функция:
console.info(auth.getToken());
req = req.clone({
setHeaders: {
'Content-Type': 'application/json; charset=utf-8',
'Authorization': 'Bearer ' + auth.getToken()
}
});
Да ладно, я хочу вернуться из моей "полной статьи". Как видите, там есть возврат.
Да, я это понимаю, но неясно, чего вы ожидаете. Вернуть к чему?
Я отредактировал свой вопрос. Я ожидаю, что auth.getToken () вернет значение, указанное в операторе return.
Вы не поняли, как работает async (RxJs / Promise) JavaScript-программирование.
Прежде всего обратите внимание, что он не может возвращаться синхронно. Вам нужно вернуть наблюдаемое. Во-вторых, обратите внимание, что вы не должны подписываться в методе, если планируете возвращать наблюдаемое.
Если я верну наблюдаемый. Это означает, что я должен копировать тело в (err -> {// body}) для каждого вызова, верно? Я не хочу этого делать ...
См., Например, stackoverflow.com/questions/36342784/…. Обратите внимание, что вы можете использовать, например, .catch
для централизации обработки ошибок.
Извините, но я новичок в Angular. Я действительно не вижу в этом вопросе более широкой картины. У меня в подписке 2 звонка.
Я постараюсь объяснить вам, что происходит.
В любом из этих случаев вы передаете обратный вызов, который должен выполняться при каждом из этих событий. Поскольку вы возвращаетесь внутри этих обратных вызовов, вы возвращаете не метод getToken, а функцию, которая вызывается внутри метода подписки. Представьте себе возможную реализацию метода подписки:
subscribe(nextCB, errorCB, completeCB){
...
if (completed) {
completeCB();
}
}
Как видите, значение, которое вы возвращаете для полного обратного вызова, не присваивается и не возвращается. У вас есть несколько решений / альтернатив для вашего случая. Вы можете вернуть сам наблюдаемый (this.meService.getMe ()) с некоторыми картами, а затем подписаться на него, где хотите, или вы можете просто запустить свой код внутри полного обратного вызова. Но IMO лучше потратить некоторое время на поиск общих концепций закрытия javascript и async.
Вернуть на что именно? Ваш внешний метод ничего не возвращает.