4

Windows 8 モバイル アプリの開発は初めてです。

Javascript/HTML5 で「Grid App」をカスタマイズし、data.js を変更してデータを取得し、「SampleDate」配列に入力しようとしています。

Web フィードからのデータの取得は完了しましたが、問題は、要求が非同期であるため、応答を待たずに実行が進行することです。

配列は常に空になりますが、配列データをコンソールに記録しようとすると、フェッチ後に適切に記録されます。

取得したデータを入力して表示できるようにするための解決策を教えてください。

これがデフォルトの方法を変更したgenerateSampleData()方法です。

WinJS.xhr({ url: "http://www.yamu.lk/feed/" })
       .done(function complete(result) {

           console.log(result.responseXML);
           var items = result.responseXML.querySelectorAll("item");
           for (var n = 0; n < items.length; n++) {
               sampleItems[n] = { group: sampleGroups[0], title: items[n].querySelector("title").textContent, subtitle: "Item Subtitle: 1", description: items[n].querySelector("description").textContent, content: itemContent, backgroundImage: lightGray };
               console.log(items[n].querySelector("title").textContent);

           }


           },
           function error(error) {

           },
           function progress(result) {

           });

        return sampleItems;
4

2 に答える 2

1

問題は、ListViewがsampleItems配列に直接バインドされておらず、sampleItemsがプッシュされているバインディングリストにバインドされていることに起因します。data.jsの12行目を確認してください。

 generateSampleData().forEach(function (item) {
    list.push(item);
});

あなたがしたいのは、データがWebサービスから取得されるまで、データをバインディングリストにプッシュするのを待つことです。これを行う1つの方法は、generateSampleData()関数がsampleItems配列の代わりにWinJS.xhrpromiseを返すようにすることです。したがって、generateSampleData()は次のようになります。

return WinJS.xhr({ url: "http://www.yamu.lk/feed/" });

12行目は次のようになります。

generateSampleData().done(function complete(result) {
       console.log(result.responseXML);
       var items = result.responseXML.querySelectorAll("item");
       for (var n = 0; n < items.length; n++) {
           list.push({ group: sampleGroups[0], title: items[n].querySelector("title").textContent, subtitle: "Item Subtitle: 1", description: items[n].querySelector("description").textContent, content: itemContent, backgroundImage: lightGray });
           console.log(items[n].querySelector("title").textContent);
       }});

またはそれらの線に沿った何か。

詳細については、バインディングリストがどのように機能するかを確認してください。

于 2013-03-18T19:29:39.570 に答える
0

1) IsWaitingForData のようなグローバル変数を宣言します

2) 要求を送信する前に、値を True に設定します。

3) 完了関数では、データの再試行時に変数が false に設定されます。

4) 配列を使用します。

JavaScript の promise について読む必要があります:リンク

非同期プログラミングに関する記事は次のとおりです:リンク

プロミスに関する良い記事は次のとおりです:リンク

var promises=WinJS.xhr({ url: "http://www.yamu.lk/feed/" });
WinJS.Promise.join(promises).then(function () {
        //do something with array
    });
于 2013-02-28T22:50:54.903 に答える