这里是我所拥有的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.log("there");
});
}
}
我希望看到console.log("有")打印但this.value
始终保持为空,即使您已在fetchValueFromServer
中设置。为什么是这样?
如果你对is_ready
的看法感到好奇,这是一个简单的承诺:
function is_ready(variable) {
return new Promise((resolve, reject) => {
let interval = setInterval(() =>
{
if (variable) {
clearInterval(interval);
resolve();
}
}, 100);
});
}
答案 0 :(得分:2)
问题在于is_ready
功能的逻辑。看起来您希望该函数重复检查该值是否存在,然后解决该问题。但是,由于JS中的闭包如何工作,即使在variable
更改之后,this.value
参数在该函数体的上下文中也只会有一个值。看看这个小例子:
let secret = 'not found yet'
function checkSecret(secretArg) {
setInterval(() => {
console.log(secretArg)
}, 500)
}
checkSecret(secret)
setTimeout(() => { secret = 'secret found!' }, 1000)

此代码将始终打印“尚未找到”,因为它会检查已在本地分配的secretArg
变量,而不是secret
直接变量。
答案 1 :(得分:0)
您似乎需要在函数variable
中使用is_ready
值解析,如下所示:
resolve(variable);
然后在控制台日志中添加一个参数以确定更多信息,如下所示:
fetchSecondValueFromServer() {
is_ready(this.value).then((returnValue) => {
console.log("there", returnValue);
});
}
答案 2 :(得分:-1)
想通了,is_ready
中的值是按值传递的! Javascript需要实现&所以我们可以通过ref传递垃圾!