是否可以在该函数中递归调用异步函数的无名回调函数?
这是伪代码,但我的想法是我想重新调用失败的http请求。
function(err, res) { //parent callback
request.get(URL, function(err, res) {
if (err == 209) { //call the nameless parent function but how?
}
});
}
答案 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
中包含对自身的引用。由于关闭的全能性,这也可以在内部功能中使用。