拥有我认为应该是一个相对容易的问题,以应对是一个重大的痛苦......我正在努力:
a.b("param", function(data)
{
logger.debug("a.b(" + data.toString() + ")");
if (data.err == 0)
{
// No error, do stuff with data
}
else
{
// Error :( Redo the entire thing.
}
});
我的方法是尝试:
var theWholeThing = function() {return a.b("param", function(data)
{
logger.debug("a.b(" + data.toString() + ")");
if (data.err == 0)
{
// No error, do stuff with data
}
else
{
// Error :( Redo the entire thing.
theWholeThing();
}
})};
上面的问题是前者确实有效(除非在发生错误时没有处理),后者根本就不会打印日志消息......就好像“theWholeThing()”调用不能正常工作一样认为它应该(再次调用整个事物)。
这里肯定有一些巧妙的错误,任何提示?
谢谢!
答案 0 :(得分:4)
首先,直接回答你的问题,听起来好像你第一次忘记实际调用该函数。尝试:
var theWholeThing = function() {return a.b("param", function(data)
{
logger.debug("a.b(" + data.toString() + ")");
if (data.err == 0)
{
// No error, do stuff with data
}
else
{
// Error :( Redo the entire thing.
theWholeThing();
}
})};
theWholeThing(); // <--- Get it started.
但是,在命名的IIFE(立即调用函数表达式)中可以更优雅地实现这一点:
// We wrap it in parentheses to make it a function expression rather than
// a function declaration.
(function theWholeThing() {
a.b("param", function(data)
{
logger.debug("a.b(" + data.toString() + ")");
if (data.err == 0)
{
// No error, do stuff with data
}
else
{
// Error :( Redo the entire thing.
theWholeThing();
}
});
})(); // <--- Invoke this function immediately.
答案 1 :(得分:0)
如果将方法分开并使用变量来表示,事情就会变得清晰。您只需要将a.b和匿名函数视为方法参考。我认为这段代码示例可以提供帮助:
var theWholeThing = a.b, //this is a reference of b method
par = "param",
callback = function(data){
logger.debug("a.b(" + data.toString() + ")");
if (data.err == 0)
{
console.log("no error");
}
else
{
console.log("Error");
// theWholeThing reference can be accessed here and you can pass your parameters along with the callback function using variable name
theWholeThing("param", callback);
}
}; //declare the callback function and store it in a variable
theWholeThing("param", callback); //invoke it