mixiアプリの作成について質問です。

mixiアプリに限らずjavascriptを利用したwebプログラムには共通の事だと思いますが
下記のようなプログラムを書いたとき、想定した結果を得られません。

<script type="text/javascript">
var name_from_getname;//グローバル変数
function getname() {
var req = opensocial.newDataRequest();
req.add(req.newFetchPersonRequest(opensocial.IdSpec.PersonId.VIEWER), "viewer");
req.send(function(data) {
var viewer = data.get("viewer").getData();
name_from_getname = viewer.getDisplayName();
alert(name_from_getname + ":alert from getname");
});
}

function init(){
getname();
alert(name_from_getname);
}

gadgets.util.registerOnLoadHandler(init);
</script>

init()からgetname()を呼び出し、この中でグローバル変数name_from_getnameにユーザ名を代入します。
この処理が終わったらalertでユーザ名を出力するのですが、実行すると、

"undefind"
"ユーザ名:alert from getname"

の順番にアラートが表示されます。
つまりgetname()の文法は間違っておらず、処理される順番が入れ違ってしまっているという事です。
本件の原因と対処法をご存知の方、ご教示下さい。
できればinit()の中身をいじらずに対応できると嬉しいです。
また、ソースを記載していただくと助かります。

回答の条件
  • 1人1回まで
  • 13歳以上
  • 登録:2011/03/29 23:02:26
  • 終了:2011/04/05 23:05:02

回答(2件)

id:a-kuma3 No.1

a-kuma3回答回数4606ベストアンサー獲得回数19432011/03/29 23:20:37

ポイント35pt

opensocial.newDataRequest は、XMLHTTPRequest を使って実装されていると想像できますが、

この手の実装では、非同期にリクエストを処理します。

つまり、Webサーバにリクエストは出すけど、その応答を待たずにメソッドが終了する、ということです。


データを取得した後に何かの処理をしたいのであれば、req.send に書いてある function の中に処理を書きます。

つまり、init() の中の getname() の後に書きたい処理があるなら、

req.send() で指定する関数の中に書く必要があります。

function getname() {
    var req = opensocial.newDataRequest();
    req.add(req.newFetchPersonRequest(opensocial.IdSpec.PersonId.VIEWER), "viewer");
    req.send(function(data) {
        var viewer = data.get("viewer").getData();
        name_from_getname = viewer.getDisplayName();
        ★ここに書く
    });
}

function init(){
    getname();
    ☆ここじゃない
}
id:MR_sunekichi

a-kuma3さんありがとうございます。

やはりそれしかないですか。

上記のようにすると関数が数珠つなぎになってスマートじゃないからさけたかったのですが。

2011/03/29 23:48:55
id:pretaroe No.2

pretaroe回答回数531ベストアンサー獲得回数752011/03/30 02:53:20

ポイント35pt

function init(){

getname();

while(target == undefined){:} //リクエストが終わるまで待つ処理をいれる

alert(name_from_getname);

}

非同期なので、同期をとる処理をもっとまともな感じで入れればよいと思います。

このサンプルはよくない。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません