所以,我在玩白色Google Calendar API的时候正在学习Javascript,我只是无法弄清楚这段代码是如何运作的:
var entriesResult = [];
var data = new Date(2010,3,22,17,0,0);
var callback = function(result) {
var entries = result.feed.getEntries();
if (entries.length != 0) {
entriesResult = eventsManager(entries, 0, data);
window.alert("inner entriesResult " + entriesResult.length);
}
}
this.service.getEventsFeed(this.query, callback, handleGDError);
window.alert("outer entriesResult " + entriesResult.length);
eventsManager()是一个返回Objects数组的函数。
getEventsFeed()它是一个API函数:它查询服务并将“feed root”(包含所选项的feed)传递给回调函数。
为什么第一个警报(内部..)输出有效的entriesResult.length而第二个警告(外部..)总是输出0?
我认为javascript数组总是通过引用传递,我的代码有什么问题? 谢谢:))
答案 0 :(得分:3)
getEventsFeed
函数进行异步AJAX调用,并在服务器回复时调用callback
。换句话说,回调函数在其余代码之后运行一段时间。
因此,当数组仍为空时,外部alert
在回调之前执行。
要从AJAX调用返回值,您需要接受回调作为参数,然后在有值返回后调用回调。
例如:
function myFunction(someParam, callback) {
//Do things...
var eventsFeedCallback = function() {
//Do more things, and figure out what to return
callback(someValue); //Call the user's original callback to give back a value
};
this.service.getEventsFeed(this.query, eventsFeedCallback , handleGDError);
//Do more things...
}
您可以像调用getEventsFeed
一样调用此功能
例如:
myFunction("Parameter!", function(value) {
//This is the callback, and will be called when the AJAX call finishes
//Do things with value
});
答案 1 :(得分:1)
该行:
window.alert("outer entriesResult " + entriesResult.length);
启动异步操作(完成之前)后,立即执行 。
在异步操作完成后,稍后执行回调函数中的行。