2

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

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

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

3 回答 3

1

我不认为有办法用一个无名的函数来做到这一点,但为什么不给它一个名字呢?

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

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

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

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

于 2013-08-05T16:23:42.257 回答
1

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

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

简化演示:http: //jsfiddle.net/UqMhK/

然后你会obj.a();像往常一样打电话。

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

于 2013-08-05T16:36:09.857 回答
1

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

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

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

于 2013-08-05T17:03:45.487 回答