Titanium で、JSDeferred を使って順次処理するサンプルです。

JSDeferredで,面倒な非同期処理とサヨナラ - gihyo.jp

バージョン – 追記(2011/03/23)

Titanium
1.5.1
JSDeferred
0.4.0

Titanium 1.6.1 で動かない問題は、@Seasons さんがパッチを書いてくださいました。感謝!! パッチが公開されたらリンクします!

Seasons.NET

サンプルコード

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Titanium.include(Titanium.App.appURLToPath("app://lib/jsdeferred.js"));
Deferred.define();

var currentLocation = null;
(function() {
  var deferred = new Deferred();
  Titanium.Geolocation.addEventListener("location", function(e) {
    currentLocation = e.coords;
    deferred.call();
  });
  return deferred;
})().
next(function() {
  alert(currentLocation);
});

alert("ここは必ずしも、alert(currentLocation)の後に呼び出されるとはかぎらない!");

alert(currentLocation) としているところに現在位置を取得した後のコードを記述することで、現在位置を取得して何か処理をするというのを順序を保証して処理することができるようになります。

ただし、next の外側の処理は非同期で進んでしまうため、必ずしも、alert(currentLocation) との順序は保たれません。

Titanium Mobile - appcelerator

JSDeferred

Titanium で include でファイルを読むときのテクニック

1
Titanium.include(Titanium.App.appURLToPath("app://lib/jsdeferred.js"));

上記の様に、 app: プロトコルを使用して、appURLToPath メソッドでファイルを読み込むことで、Titanium のResources フォルダからの相対パスで書けるようになります。