如何识别回调函数

时间:2017-03-18 00:26:57

标签: callback

您好我咨询过:https://stackoverflow.com/a/9652434/3109607但仍然遇到回调问题。我还检查过JS是性感的,callbackhell-dotcom,CW Beuchler的博客,Github上的Maxogen回购以及其他关于这个主题的回复。

先生。 Beuchler非常友好地回答我的问题,但没有他指出我无法确定哪个函数“thingToRun”在下面链接的要点中。我想在这里包含代码,但我遇到了麻烦所以我不得不使用这个要点。

在大多数函数中,这被写成“回调”,所以他写的是为了说明它不一定是,但我仍然无法识别哪个函数被传递到getData。当我消除Beuchler先生的评论并试图自己找到它时,我遇到了麻烦。对我来说,它看起来像logData(我只是基于每个函数接收的参数)但这是一个常规函数。或许我误解了功能。

我需要信息来编写一个获取用户纬度/经度的简单应用,检查google的API以根据纬度/经度获取用户的城市名称,然后检查Dark Sky API以获取您当地的天气基于纬度/经度。所以在此之后我必须弄清楚如何让多个回调一起玩。

链接到Beuchler先生的要点(有帮助,但我仍然没有得到)对我的回应:https://gist.github.com/theednaffattack/25d24d620cc35b160c17a95756fd1927

1 个答案:

答案 0 :(得分:0)

如果我正确理解了这个问题,您打算将function的名称作为回调传递。如果您的function看起来像这样:

function myFunc(/*some parameters*/) {
    //Do something
}

然后您可以在大多数网络浏览器中使用myFunc.name获取其名称。要使这个防弹,你需要function这样:

function getFunctionName(func) {
    if (typeof func === "function") { //Make sure the input is a function
        if (func.name) { //This is a named function
            return func.name;
        }
        var text = func + "";
        text = text.substring(0, text.indexOf("(")).trim();
        var spaceIndex = text.indexOf(" ");
        if (spaceIndex > 0) { //We need something like function myFunc
            return text.substring(text.indexOf(" ")).trim();
        }
        return ""; //Does not have a name
    }
    return false; //Not a function
}

现在

console.log(getFunctionName(myFunc));

将产生

  

myFunc的

console.log(getFunctionName());

将产生

  

console.log(function() {});

将产生空字符串,因为function没有名称。

如果我们定义类似这样的东西

function something() {
    this.somethingElse = function() {};
}

然后

console.log(getFunctionName((new something()).somethingElse));

将产生空字符串。显然,我们希望它能够产生somethingElse,但我们需要对此进行额外的调整。建议:

function nameFunction(func, name) {
    func.funcionName = name;
    return func;
}

然后

function something() {
    this.somethingElse = nameFunction(function() {}, "somethingElse");
}

然后将我们一直使用的function更改为

function getFunctionName(func) {
    if (typeof func === "function") { //Make sure the input is a function
        if (func.name) { //This is a named function
            return func.name;
        } else if (typeof func.functionName === "string") { //We called nameFunction on this
            return func.functionName;
        }
        var text = func + "";
        text = text.substring(0, text.indexOf("(")).trim();
        var spaceIndex = text.indexOf(" ");
        if (spaceIndex > 0) { //We need something like function myFunc
            return text.substring(text.indexOf(" ")).trim();
        }
        return ""; //Does not have a name
    }
    return false; //Not a function
}

现在您已准备好从getFunctionName拨打getData,如下所示:

function getData(dataURI, thingToRun) {
  var myData = getSomeData();
  console.log(getFunctionName(thingToRun));
  thingToRun(myData);
}