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 関数です。サービスにクエリを実行し、「フィード ルート」(選択されたアイテムを含むフィード) をコールバック関数に渡します。

最初のアラート (inner..) が有効な entryResult.length を出力するのに、2 番目のアラート (outer..) が常に 0 を出力するのはなぜですか?

JavaScript 配列は常に参照によって渡されると思いましたが、コードの何が問題になっていますか? ありがとうございました :)

4

2 に答える 2

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
});
于 2010-03-21T16:08:23.243 に答える
1

この線:

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

非同期操作を開始した直後(完了する前) に実行されます。

コールバック関数の行は、非同期操作が完了した後に実行されます。

于 2010-03-21T16:09:58.543 に答える