我有一个返回ID的http post请求。然后我尝试将该ID传递给另一个函数。但是,在下一个函数中,我有一个超时,它将循环该函数以检查状态。每次在超时函数内都返回未定义的ID。
第一个功能
这里我有'res',这是另一个函数的结果。我从返回的json中获取状态ID并将其发送到'getAlbum'。
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);
}
这里的任何帮助都将非常感激:)
答案 0 :(得分:1)
这是因为变量的范围。
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);
}
});
};
在函数的上下文中,this
引用函数本身,而不是对象。
您需要使用这样的闭包或胖箭头。
var checkAblumStatus = (statusIDRequest) => {
您还需要为您的通话提供可用信息。
setTimeout(checkAblumStatus(variable), 1000);
答案 1 :(得分:0)
你可以传递函数的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);
}
答案 2 :(得分:0)
你对变量和参数名称感到困惑。
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);
}