是否可以在JavaScript中递归调用'this'?

时间:2013-08-05 16:18:07

标签: javascript asynchronous

是否可以在该函数中递归调用异步函数的无名回调函数?

这是伪代码,但我的想法是我想重新调用失败的http请求。

function(err, res) { //parent callback
    request.get(URL, function(err, res) {
        if (err == 209) { //call the nameless parent function but how?
        }
    });
}

3 个答案:

答案 0 :(得分:1)

我认为有一种无法使用无名功能的方法,但为什么不给它命名呢?

function doRequest(err, res) {
  request.get(URL, function(err, res) {
      if (err==209) {
          doRequest();
      }
  });
}

您仍然可以像使用匿名函数一样使用此函数作为内联回调,它恰好有一个名称。例如:

setTimeout(function doRequest(err, res) { ... }, 200 );

或者,如果您直接调用它,可以在IIFE内创建它,以避免将其名称泄露到您当前的范围内。

答案 1 :(得分:1)

你可以创建一个闭包并引用你声明的内部函数,如:

var obj = {
    a: (function () {
        var func = function() { //parent callback
            request.get(URL, function(err, res) {
                if (err == 209) {
                    func();
                }
            });
        };
        return func;
    }())
};

简化版DEMO: http://jsfiddle.net/UqMhK/

然后,您可以像平常一样致电obj.a();

这使您可以保留原始结构,而不必命名匿名函数,但可以完成您想要的内容。

答案 2 :(得分:1)

有很多方法可以做到这一点,但我认为您发布的代码的最佳方式应该是这样的:

var stillALambda = function thatFunction(err, res) {
  request.get(URL, function(err, res) {
    if (err == 209) thatFunction();
  });
};

上面的函数仍然是一个lambda,但现在外部函数的作用域在thatFunction中包含对自身的引用。由于关闭的全能性,这也可以在内部功能中使用。

相关问题