递归函数没有正确返回

时间:2015-03-26 06:00:32

标签: javascript ajax recursion

我的代码如下

function lp(p, list, count) {
    $.ajax({url: 'ajax.php', data: {id:p}, success: function (data) {
        // the ajax output an image's url, based on the id p
        if(p>count) {
            return list;
        } else {
            lp(p+1, list+'<img src="' + data + '"><br>', count);
        }
    }})
}
alert(lp(1,"",5));

问题是,每当我运行代码时,“undefined”总是弹出

所以为了解开我的谜团,我添加了几行来调试我的代码,这就是我得到的

function lp(p, list, count) {
    $.ajax({url: 'ajax.php', data: {id:p}, success: function (data) {
        // the ajax output an image's url, based on the id p
        if(p>count) {
            alert("Done");
            return list;
        } else {
            alert("Entering phase " + p);
            lp(p+1, list+'<img src="' + data + '"><br>', count);
        }
    }})
}
alert(lp(1,"",5));

通过更改为此,结果变为“Undefined”,然后是“Entering Phase X”,然后是“Done”,这意味着第一个undefined由alert(lp)代码返回,之后它实际进入并解析递归函数内的所有数据。

有没有办法可以强制脚本在解析前等待AJAX​​完成?

编辑:我也尝试过更改

alert(lp(1,"",5));

list=lp(1,"",5);
alert(list);

当然,这不起作用

2 个答案:

答案 0 :(得分:1)

您可以在函数中添加回调,如:

function lp(p, list, count, callback) {
    $.ajax({url: 'ajax.php', data: {id:p}, success: function (data) {
        // the ajax output an image's url, based on the id p
        if(p>count) {
            alert("Done");
            callback(list);
        } else {
            lp(p+1, list+'<img src="' + data + '"><br>', count, callback);
        }
    }})
}

lp(1,"",5, function(data) {
    alert(data);
});

当您的ajax请求完成时会触发alert(data);

答案 1 :(得分:0)

代码的问题是$ .ajax是一个异步函数。 Lp()将调用$ .ajax(),但是,不会立即调用成功回调。相反,你的代码将运行$ .ajax()然后到达你的Lp函数的底部(它不返回任何东西)。当服务器从ajax调用返回响应时,将触发成功回调(但是当时警报已经显示未定义。

最好的解决方案是在你的lp函数中传递一个回调函数,该函数会在调用成功时调用alert:

function lp(p, list, count, callback) {
  $.ajax({url: 'ajax.php', data: {id:p}, success: function (data) {
      // the ajax output an image's url, based on the id p
      if(p>count) {
          callback(list);
      } else {
        lp(p+1, list+'<img src="' + data + '"><br>', count, callback);
      }
  }})
}
alert(lp(1,"",5), function(list) {
  console.log(list);
});