Почему переменная равна null?
Есть метод, который отправляет данные в расширение хрома и получает ответ:
myMethod(): void {
const editorExtensionId = 'someId';
const message = {
msg: 'someMsg',
arr: 'someArr',
};
chrome.runtime.sendMessage(editorExtensionId, message, res => {
if (res === 0) {
alert('...');
return 0;
}
if (res.error !== 0) {
if (res.error === -1) {
alert('...');
}
return 0;
}
if (res.certsCount == null || res.certsCount === 0) {
alert('...');
return 0;
}
console.log(res);
return res;
});
}
Вызывая console.log(res) в консоли отображается объект, который мне нужен. В компоненте в переменную записываю результат вызова метода:
getCertificates(): void {
this.cert$ = this.authService.myMethod();
}
Почему переменная cert$ равна null? И как это исправить? Заранее всем спасибо!
Ответы (1 шт):
Во первых
Ты пишешь
myMethod(): void
void предпологает что ф-я ничего не возвращает.
а затем
this.cert$ = this.authService.myMethod();
если ты используешь IDE ты должен был получить тут ошибку и уже в этот момент "заподозрить неладное".
в качестве IDE рекомендую VSCode
Почему?
Почему переменная равна null?
в типах(TypeScript)
потому что myMethod(): void
в JavaScript
Потому что myMethod ничего не возвращает, в отличии от callBack ф-ии, внутри которой и выполняется console.log(res);
class Q {
myMethod(): void {
const editorExtensionId = 'someId';
const message = {
msg: 'someMsg',
arr: 'someArr',
};
chrome.runtime.sendMessage(editorExtensionId, message, callBack);
function callBack(res) {
if (res === 0) {
alert('...');
return 0;
}
if (res.error !== 0) {
if (res.error === -1) {
alert('...');
}
return 0;
}
if (res.certsCount == null || res.certsCount === 0) {
alert('...');
return 0;
}
console.log(res);
return res;
}
}
}
как?
- Promise - https://learn.javascript.ru/promise
- async/await - https://learn.javascript.ru/async-await
Без гарантий. как-то так:
type $res = any
class Q {
async myMethod(): Promise<$res> {
const editorExtensionId = 'someId';
const message = {
msg: 'someMsg',
arr: 'someArr',
};
const promise: Promise<$res> = new Promise((resolve, reject) => {
chrome.runtime.sendMessage(editorExtensionId, message, resolve);
})
const res: $res = await promise;
if (res === 0) {
alert('...');
return 0;
}
if (res.error !== 0) {
if (res.error === -1) {
alert('...');
}
return 0;
}
if (res.certsCount == null || res.certsCount === 0) {
alert('...');
return 0;
}
console.log(res);
return res;
}
}