我在此处遵循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);
});
},
答案 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
回调;如果发生这种情况,这些功能将在适当的时间回叫。