Javascript 嵌套函数中未定义的变量

Javascript 嵌套函数中未定义的变量,javascript,undefined,Javascript,Undefined,我有一个http post请求,它返回ID。然后我尝试将该ID传递给另一个函数。但是,在下一个函数中,我有一个超时,它将循环函数以检查状态。每次在超时函数中,ID都返回undefined 第一功能 这里有'res',它是另一个函数的结果。我从返回的json中获取状态ID并将其发送到“getAlbum” anotherFunction(res) { this.getAlbum(res); } GetAlbum 如果我在该函数中立即执行控制台日志,它将发出正确的ID。但是,如果我在“check

我有一个http post请求,它返回ID。然后我尝试将该ID传递给另一个函数。但是,在下一个函数中,我有一个超时,它将循环函数以检查状态。每次在超时函数中,ID都返回undefined

第一功能

这里有'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);
}

这里的任何帮助都将非常感谢:

这是因为变量的范围

  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;恐怕应该是同一件事。