Amazon

2011年2月27日日曜日

JavaScriptの非同期通信でハマる。

OpenSocialアプリ開発においてJavaScriptでの非同期通信をよく理解していなかったのでハマった。

例えば

initializeData(){
initializeMyInfo()
initializeFrinedInfo()
setInfo()
}
という初期化メソッドがあるとする。
ここでinitializeMyInfo()は自分の情報を, initializeFriendInfo()は自分の友達の情報を
req = opensocial.newDataRequest()
で取得してくるとする。
そしてsetInfo()では取得したそれぞれ自分の情報、友達の情報を加工するとする。


ここで問題が発生する。
initializeData()はinitalizeMyInfo()->initializeFriendInfo()->setInfo()というシーケンシャルに呼び出されるので通常はinitializeMyInfo()、initializeFriendInfo()で確実にデータが取得できてsetInfo()が実行されるはずだ。
しかし、req = opensocial.newDataRequest()でデータを取得するのは非同期通信なので、setInfo()が呼び出されるタイミングで、initializeMyInfo()およびinitializeFriendInfo()がデータを取得できているかは保証がない。

非同期通信が裏目に出る結果となる。

仕方ないので、それぞれのrequestのコールバック関数内でシーケンシャルにメソッドを呼ぶことで回避する。JavaScript1.7からyeild()というメソッドで非同期通信を同期通信にすることができるようだけど、今回は時間がないのでとりあえずこれで。

initializeMyInfo(){
req = opensocial.newDataRequest()
req.send(function(response){
...
initializeFriendInfo()
});

initializeFriendInfo(){

req = opensocial.newDataRequest()
req.send(function(response){
...
setInfo()

});

あんまりキレイじゃないなぁ。。。

0 件のコメント:

コメントを投稿

Amazon3