了解回调

时间:2014-02-26 01:40:21

标签: javascript jquery ajax json callback

我在此处遵循this解释,但我仍然不确定回调是如何工作的。

我在这里打电话:

scene.foo(scene.myCallBack("mymap"));

我的回调函数在这里:

1)scene.foo调用foo并使用“mymap”JSON数据传递CallBack函数

2)foo的$ .ajax将其成功定义为在CallBack中传递。处理完数据后,success会调用回调myCallBack()

3)myCallBack尝试getJSON从文件名和console.log它作为字符串与JSON.stringfy

我不能正确理解这个吗?

foo : function (callback) {
    $.ajax({
        success: callback //once AJAX request is successfull, $.ajax will call callback (myCallBack) and pass response back to callback
    });
},
myCallBack : function (name) {
    $.getJSON("C:/Users/danniu/Desktop/JavaScript/tilemap/maps/" + name + ".json", function (data) {
        var myJSONText = JSON.stringify(data);
        console.log("json: " + this.myJSONText);        
    });
},

2 个答案:

答案 0 :(得分:0)

你接近解决方案。

scene.foo(scene.myCallBack("mymap"));首先执行scene.myCallBack("mymap"),然后将结果传递给scene.foo(...)

它类似于写:

var result = scene.myCallBack("mymap");
secene.foo(result);

在这种情况下,这很奇怪,因为scene.myCallBack("mymap");不会向scene.foo

返回任何有趣的内容

请注意,$.getJSON(...)已经为您执行了Ajax请求。

答案 1 :(得分:0)

一旦你坚持使用括号,它就会停止作为回调。 scene.myCallBack可以作为回调; scene.myCallBack("mymap")只是undefined(函数的返回值,因为它没有明确的return语句,因此隐式返回undefined)。

如果你想让他$.ajax成功myCallBack并拥有自定义参数,你需要包装它:

scene.foo(function() { scene.myCallBack("mymap"); });

或等效地,

fooCallback = function() { scene.myCallBack("mymap"; };
scene.foo(fooCallback);

编辑澄清一些概念:

  

你能解释为什么把括号放在上面会使它不是回调吗?

将括号放在函数上会执行一个函数,返回一个值。回调必须是函数。

例如,假设你的妈妈在你回家时想让你吃一个苹果。她可以给你留个笔记,“咆哮者,回家后,吃一个苹果!”:

var eatApple = function() {
  growler.eat('apple');
}

growler.on('getHome', eatApple);

是写这种东西的一种方式。但是,如果你写

growler.on('getHome', eatApple());

就像你的妈妈喂你一个苹果,然后写一个音符“咆哮者,当你回到家, _ _”并将苹果核心放在空白处。我不了解你,但我会对这样的笔记感到惊讶;我敢说你的JavaScript解释器同样也很惊讶。

回调是稍后要完成的功能。如果你执行它(带括号),你只剩下函数的结果;因此该函数不是回调函数,因为您的事件将尝试回调结果(苹果核心),而不是函数(吃苹果的过程)。

(高级主题是返回函数的函数;在这种情况下,结果可以是回调,例如,growler.on('getHome', whatShouldIDoNow())whatShouldIDoNow仍然不是回调;它将返回的函数将是。)

  

如果$ .getJSON已经是一个AJAX请求,我该如何从中获取回调?

我不明白这个问题。您在调用时提供 $.getJSON回调;如果发生这种情况,这些功能将在适当的时间回叫。