tetsunosukeのnotebook

tetsunosukeのメモです

prototype.jsを使ったときのグローバル変数の挙動がわからない・・・

<script type="text/javascript">
var meta;
// -------------------------------------------------------
// Metaクラスのオブジェクト定義
function Meta(title, description)
{    
    if(title){
        this.title = title;
    }
    if(description){
        this.description = description;
    }
}
Meta.prototype = {
    title: null,
    description: null,
    setTitle: function(title){
        this.title = title;
    },
    setDescription: function(description){
        this.description = description;
    },
    getTitle: function(){
        return this.title;
    },
    getDescription: function(){
        return this.description;
    }
};
//---------------------------------------------------------

// 外部サービスから情報を取得してsetMetaを呼び出し
function getMetaInfo(imageid){
    var url = "./getMetaInfo.php";
    var params = "id=" + imageid;
    var ajax = new Ajax.Request(
      url,
      {
        method: 'get',
        parameters: params,
        onComplete: setMeta
      }
    );
}
function setMeta(ajax,json){
    title = json.title;
    alert(title);    ←ちゃんと出力される
    meta.setDescription(json.description);
    alert(meta.description); ←ちゃんと出力される
    meta.setTitle(json.title);
}


// こっから問題
// start
meta = new Meta();
getMetaInfo(232716791);
alert(meta.title); ←出力されない!!!!!!(ていうかnull)

これって、getMetaInfoから呼び出されたsetMetaが、グローバルにしたつもりのmetaの変数を変更できてないってことよねえ。なんでだろう・・・・どうすればいいのかな。両方のメソッドを、Metaクラスの中に移せばいいだろうか?

ちょっと気になったのだけど、alert(meta.title)が先に出てから、alert(title)が出るんだよね。これってAjaxだから、getMetaInfoが戻ってくる前にmeta.titleが呼び出されているってことになるんだろうなきっと・・・。非同期の部分をfalseにしたらうまく動きそうな気がしてきました。

って、いやいや、onCompleteだからねえ・・・