【问题标题】:Javascript Array Scope - newbie hereJavascript Array Scope - 新手在这里
【发布时间】:2010-03-21 16:05:26
【问题描述】:

所以,我在玩白色 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 数组总是通过引用传递,我的代码有什么问题? 谢谢你:)

【问题讨论】:

  • 你的问题。看我的回答。

标签: javascript arrays gdata-api


【解决方案1】:

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
});

【讨论】:

  • 我明白了。我该如何解决?因为我需要返回entryResult。
  • 你需要让你的函数接受一个回调而不是返回一个值,就像getEventsFeed一样。这是 AJAX 的一个基本限制。
  • 您能详细说明一下吗?我真的是 js/ajax 的新手 谢谢!
【解决方案2】:

行:

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

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

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

【讨论】:

    猜你喜欢
    • 2016-01-07
    • 1970-01-01
    • 2012-05-10
    • 2017-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-07
    • 2018-12-23
    相关资源
    最近更新 更多