#javascript
#javascript
Вопрос:
Я пытаюсь вызвать функцию в своем действии, но получаю ошибку this.setToken is not a function
:
async function setToken() {
const {
credentials: { year, group, student }
} = this.props;
const fcmToken = await firebase.messaging().getToken();
if (fcmToken) {
firebase
.firestore()
.collection("users")
.doc(fcmToken)
.set({
year
})
.then(function() {
return true;
})
.catch(function(error) {
return false;
});
}
}
export function fetchEvents(id) {
const currentDateString =
moment().format("YYYY-MM-DD") "T" "07:00:00.000Z";
const url = xxx;
return async dispatch => {
dispatch(isLoading(true));
const setToken = await setToken(); // call here
fetch(url)
.then(response => {
return response;
})
.then(response => response.json())
.then(data => {
const { error } = data;
if (error) {
dispatch(hasErrored(error.message));
} else {
dispatch(fetchSuccessEvents(data.items));
}
navigate("Month");
dispatch(isLoading(false));
});
};
}
Есть идеи?
Комментарии:
1.
this
это не то, что вы думаете. Используйтеbind
или сохраните ссылку на нее, когда она у вас есть. И, пожалуйста, зарегистрируйте объект, движок JS вам не врет.2. да, почитайте о контексте
this
в javascript
Ответ №1:
setToken
определяется как автономная функция, а не свойство экземпляра, или текущего this
, или чего-либо подобного:
async function setToken() {
Итак, вызывайте ее так, как вы вызывали бы любую другую функцию, не ставя this
перед ней.
Вы также не можете использовать то же самое имя переменной во внутренней области видимости, иначе вы будете ссылаться на внутреннюю переменную (которая будет начинаться как undefined
/ неинициализированная); вместо этого присвоите результат другому имени переменной:
const token = await setToken();
Но ваш текущий код ни к чему не имеет setToken
разрешения, и в этом случае вы можете просто await
использовать его, не присваивая результат чему-либо:
await setToken();
Комментарии:
1. Ах, вы тоже используете одно и то же имя переменной, нужно это исправить, чтобы вы использовали другое
Ответ №2:
Используйте
setToken()
вместо
this.setToken()
Насколько я могу судить, вы находитесь не в среде класса, поэтому setToken()
это не экземпляр или свойство, а автономная функция.
Если вы предпочитаете использовать обозначение класса, вы могли бы использовать window.setToken()
.