人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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()の中身をいじらずに対応できると嬉しいです。
また、ソースを記載していただくと助かります。

●質問者: かすかべぼうえいたい
●カテゴリ:ウェブ制作
✍キーワード:.new ADD GET JavaScript mixiアプリ
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● a-kuma3
●35ポイント

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();
 ☆ここじゃない
}
◎質問者からの返答

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

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

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


2 ● pretaroe
●35ポイント

function init(){

getname();

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

alert(name_from_getname);

}

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ