Javascript 嵌套函数中未定义的变量
我有一个http post请求,它返回ID。然后我尝试将该ID传递给另一个函数。但是,在下一个函数中,我有一个超时,它将循环函数以检查状态。每次在超时函数中,ID都返回undefined 第一功能 这里有'res',它是另一个函数的结果。我从返回的json中获取状态ID并将其发送到“getAlbum”Javascript 嵌套函数中未定义的变量,javascript,undefined,Javascript,Undefined,我有一个http post请求,它返回ID。然后我尝试将该ID传递给另一个函数。但是,在下一个函数中,我有一个超时,它将循环函数以检查状态。每次在超时函数中,ID都返回undefined 第一功能 这里有'res',它是另一个函数的结果。我从返回的json中获取状态ID并将其发送到“getAlbum” anotherFunction(res) { this.getAlbum(res); } GetAlbum 如果我在该函数中立即执行控制台日志,它将发出正确的ID。但是,如果我在“check
anotherFunction(res) {
this.getAlbum(res);
}
GetAlbum
如果我在该函数中立即执行控制台日志,它将发出正确的ID。但是,如果我在“checkAblumStatus”函数中执行,则ID部分未定义
getAlbum(id){
var statusID = id.status_id;
console.log('id = ' + statusID) // returns id
var statusIDRequest = 'url' + statusID;
var checkAblumStatus = function (statusIDRequest) {
console.log('statusIDRequest = ' + statusIDRequest) // returns undefined for the ID part
this.http.get(statusIDRequest).subscribe(res => {
if (res.status == "completed") {
// completed
} else if (res.status == "failed") {
// failed
} else {
setTimeout(checkAblumStatus, 1000);
}
});
};
setTimeout(checkAblumStatus, 1000);
}
这里的任何帮助都将非常感谢:这是因为变量的范围
var checkAblumStatus = function (statusIDRequest) {
console.log('statusIDRequest = ' + statusIDRequest) // returns undefined for the ID part
this.http.get(statusIDRequest).subscribe(res => {
if (res.status == "completed") {
// completed
} else if (res.status == "failed") {
// failed
} else {
setTimeout(checkAblumStatus, 1000);
}
});
};
在函数的上下文中,它引用函数本身,而不是对象
你需要像这样使用一个闭包或一个胖箭头
var checkAblumStatus = (statusIDRequest) => {
您还需要为您的呼叫提供一个变量
setTimeout(checkAblumStatus(variable), 1000);
您可以按如下方式传递函数的id
function getAlbum(id){
var statusID = id.status_id;
console.log('id = ' + statusID) // returns id
var statusIDRequest = 'url' + statusID;
var checkAblumStatus = ((statusIDRequest) => {
console.log('statusIDRequest = ' + statusIDRequest) // returns undefined for the ID part
this.http.get(statusIDRequest).subscribe(res => {
if (res.status == "completed") {
// completed
} else if (res.status == "failed") {
// failed
} else {
setTimeout(checkAblumStatus, 1000);
}
});
})(statusIDRequest);
setTimeout(checkAblumStatus, 1000);
}
您会混淆变量和参数名称
var statusIDRequest = 'url' + statusID;
^ ^ // this variable
var checkAblumStatus = function (statusIDRequest) {
^ ^ // .. is not the same not this param
像这样更改变量的名称,这样就不会删除该名称:
getAlbum(id){
var statusID = id.status_id;
console.log('id = ' + statusID) // returns id
var statusID = 'url' + statusID;
var checkAblumStatus = function (statusIDRequest) {
console.log('statusIDRequest = ' + statusIDRequest) // returns the ID part
this.http.get(statusIDRequest).subscribe(res => {
if (res.status == "completed") {
// completed
} else if (res.status == "failed") {
// failed
} else {
setTimeout( () => checkAblumStatus (statusIDRequest), 1000);
}
});
};
setTimeout(() => checkAblumStatus(statusID), 1000);
}
可能是Hi-Raed的副本,谢谢!我只是试了一下。它导致错误TypeError:无法读取未定义的属性“http”。有什么想法吗?我编辑了答案,只需将函数改为箭头函数谢谢@trichetriche的回复。我试了一下。但是,类型“Object”上不存在类型脚本中带有“[ts]属性”status”的“res.status”行错误。在使用胖箭头时。您输入的服务功能错误。使用this.http.getstatusIDRequest.subscriberes:any=>{,或者重新键入您的服务函数。太棒了。我现在实际上得到了一个结果。现在唯一的问题是,当它命中'else'结果时,它不会再次循环测试该函数。我尝试了您的变量来设置Timeout,并获取'Cannot invoke a expression,其类型缺少调用签名。type'void'没有兼容的调用签名。'setTimeout=>checkAblumStatusvariable,1000;恐怕应该是同一件事。