1

所以,我在玩白色 Google 日历 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() 是一个返回对象数组的函数。

getEventsFeed() 它是一个 API 函数:它查询服务并将“提要根”(带有选定项目的提要)传递给回调函数。

为什么第一个警报(内部..)输出有效的 entriesResult.length 而第二个(外部..)总是输出 0?

我坚持 javascript 数组总是通过引用传递,我的代码有什么问题?谢谢 :)

4

2 回答 2

3

getEventsFeed函数进行异步 AJAX 调用,并callback在服务器回复时调用。换句话说,回调函数在其余代码之后运行一段时间。

因此,outeralert在回调之前执行,此时数组仍为空。

编辑

要从 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
});
于 2010-03-21T16:08:23.243 回答
1

该行:

 window.alert("outer entriesResult " + entriesResult.length); 

在您开始异步操作后立即执行(在它完成之前)。

回调函数中的行稍后会在异步操作完成后执行。

于 2010-03-21T16:09:58.543 回答