0

AJAX 呼び出しから返された JSON 日付をフォーマットする必要があるクロスプラットフォーム アプリケーションに Cordova/Phonegap を使用しています。

日付は UTC として保存され、ローカル タイムゾーンに合わせてフォーマットする必要があります。したがって、コルドバnavigator.globalization.dateToStringはその法案に適合するようです。ただし、より大きなデータ文字列を構築しているため、コールバックで完全なジョブを処理できません。書式設定された日付/時刻を文字列で取得し、後で使用する必要があります。

   var myTime = new Date(parseInt(myData.StartTime.substr(6)));  // get a date object

    var myTimeString = '';
    console.log("before");
    navigator.globalization.dateToString(myTime,
            function(date)
            {
            console.log("doing");
            myTimeString = date.value;
        },
            function()
            {
            alert('Error getting dateString\n');
             },
             {
                  formatLength : 'short',
                  selector : 'date and time'
             });
    console.log("done");
    console.log(myTimeString);    // the problem is that this is not necessary set.

Android の場合、上記のコードは次のようになります。

iOS の場合、上記のコードは次のようになります。

問題は、匿名関数が非同期であり、実行されるまでに設定される場合と設定されない場合があることだと思いますconsole.log()

このタイミングの問題を解決する一般的に受け入れられている方法はありますか? または、私が欲しい/必要なものを手に入れるためのより良い方法はありますか?

- -編集 - -

以下に基づいて、私は間違った質問をしたことに気付きました。

まず、ハンドラー関数から出力を処理できるようにコードをリファクタリングしました。ご指摘ありがとうございます。それははるかにきれいです。

ただし、これをループで実行する必要があり、作業中の反復を追跡する必要があります。

for(var i = 0; i < 5; i++)
{
    var myTime = new Date(parseInt(myData.StartTime.substr(6)));  // get a date object
    navigator.globalization.dateToString(myTime, 
          function(date) {
            myTimeString = "my date is: " +date.value  +" my iterator is: "+i;
            console.log(myTimeString);
          },
          function() { alert('Error getting dateString\n'); },
          {
            formatLength : 'short',
            selector : 'date and time'
           });
}

Androidでは、次のようなものを取得します

  • my date is: some date my iterator is: 0
  • my date is: some date my iterator is: 1
  • my date is: some date my iterator is: 2
  • my date is: some date my iterator is: 3
  • my date is: some date my iterator is: 4

iOSでは、私は得る

  • my date is: some date my iterator is: 5
  • my date is: some date my iterator is: 5
  • my date is: some date my iterator is: 5
  • my date is: some date my iterator is: 5
  • my date is: some date my iterator is: 5

前の例を実行できるようにしたいのですが、何が欠けていますか?

4

1 に答える 1

0

はい、非同期呼び出しなので、コールバック関数でプロセスを続行する必要があります。

var myTime = new Date(parseInt(myData.StartTime.substr(6)));  // get a date object

var myTimeString = '';
console.log("before");
navigator.globalization.dateToString(myTime,
        function(date)
        {
           console.log("doing");
           myTimeString = date.value;
           callback(myTimeString);
        },
        function()
        {
            alert('Error getting dateString\n');
        },
        {
          formatLength : 'short',
          selector : 'date and time'
        });

function callback(myTime)
{
    console.log("done");
    console.log(myTime);
}
于 2013-06-17T10:12:39.873 に答える