Вот упрощенная версия компонента React, который у меня есть:
class Example extends Component {
constructor(props) {
super(props);
this.state = {key : 10 };
this.value = null;
}
componentDidMount() {
this.fetchValueFromServer();
this.fetchSecondValueFromServer();
}
fetchValueFromServer() {
fetch_value_from_server(this.state.key).then( (value) => {
this.value = value;
});
}
fetchSecondValueFromServer() {
is_ready(this.value).then(() => {
console.info("there");
});
}
}
Я ожидаю увидеть напечатанный console.info («там»), но this.value всегда остается пустым, даже если ты установлен в fetchValueFromServer. Почему это?
Если вам интересно, как выглядит is_ready, это простое обещание:
function is_ready(variable) {
return new Promise((resolve, reject) => {
let interval = setInterval(() =>
{
if (variable) {
clearInterval(interval);
resolve();
}
}, 100);
});
}



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Похоже, вам нужно разрешить значение variable в функции is_ready, например:
resolve(variable);
Затем добавьте параметр в журнал консоли, чтобы узнать больше, например:
fetchSecondValueFromServer() {
is_ready(this.value).then((returnValue) => {
console.info("there", returnValue);
});
}
прикинул, значение в is_ready передается по значению! Javascript необходимо реализовать, чтобы мы могли передавать дерьмо по ссылке!
кому-то не понравился мой комментарий по ссылке
Проблема в логике функции is_ready. Похоже, вы хотите, чтобы эта функция неоднократно проверяла, есть ли это значение, а затем решала, когда оно есть. Однако из-за того, как работают замыкания в JS, этот аргумент variable всегда будет иметь только одно значение в контексте тела этой функции, даже после изменения this.value. Взгляните на этот небольшой пример:
let secret = 'not found yet'
function checkSecret(secretArg) {
setInterval(() => {
console.info(secretArg)
}, 500)
}
checkSecret(secret)
setTimeout(() => { secret = 'secret found!' }, 1000)Этот код всегда будет печатать «еще не найден», потому что он проверяет переменную secretArg, которая была назначена локально, а не переменную secret напрямую.
да, спасибо, я понял это. Надеюсь, в будущем мы сможем пройти мимо исх.
если вы предлагаете передать параметр для разрешения, это не то, что я пробовал