this.setToken не является функцией

#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() .