嵌套函数中未定义的变量

时间:2018-03-22 08:54:24

标签: javascript undefined

我有一个返回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);
}

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

3 个答案:

答案 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);
}