Компонент реакции this.value имеет значение null, даже если он заполнен

Вот упрощенная версия компонента 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);
    });
}
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
38
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Похоже, вам нужно разрешить значение variable в функции is_ready, например:

resolve(variable);

Затем добавьте параметр в журнал консоли, чтобы узнать больше, например:

fetchSecondValueFromServer() {
    is_ready(this.value).then((returnValue) => {
        console.info("there", returnValue);       
    }); 
}

если вы предлагаете передать параметр для разрешения, это не то, что я пробовал

ArmenB 07.04.2018 02:55

прикинул, значение в is_ready передается по значению! Javascript необходимо реализовать, чтобы мы могли передавать дерьмо по ссылке!

кому-то не понравился мой комментарий по ссылке

ArmenB 12.04.2018 01:21
Ответ принят как подходящий

Проблема в логике функции 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 напрямую.

да, спасибо, я понял это. Надеюсь, в будущем мы сможем пройти мимо исх.

ArmenB 07.04.2018 03:39

Другие вопросы по теме