Сообщение, которое выдает React, было в основном потому, что я не ловил ошибки и не знал, где искать. Я до сих пор не знаю, почему вызов execute
вне ready
ведет себя ошибочно, но я думаю, что между вызовом методов, рендерингом и тем, к чему имеет доступ реакция, существует условие гонки. Это строго предположение. Я пока не знаю, как это доказать.
Однако я решил проблему, сделав шаг назад и подумав о своей цели. Вместо того, чтобы разбивать это на несколько методов (мой java мозг мешал), я просто использовал функцию стрелки, чтобы они связывали this
область видимости с компонентом.
try {
window.grecaptcha.ready(() => {
window.grecaptcha.execute(process.env.REACT_APP_RECAPTCHA_ID).then(data => {
this.handleRecaptchToken(data);
});
});
} catch(e) {
console.log("reCaptcha token load error: " + e);
}
Это связано с тем, что setState
может использовать необязательный метод обратного вызова в качестве второго параметра, что позволяет handleRecaptchToken
извлекать данные после завершения данных токена.
handleRecaptchToken = data => {
this.setState({"recaptchaToken" : data}, this.fetchRecaptchaData);
}
fetchRecaptchaData
затем вызывает API на моем сервере, чтобы получить данные Google и обновить состояние еще раз.