1

私は Windows 8 JavaScript アプリケーションを持っています。このアプリケーションでは、RESTful サービスから製品を取得する VirtualDataSource を Listview にバインドしています。

//ユーザーがスクロールするとデータをフェッチする itemsFromIndex: function (requestIndex, countBefore, countAfter) {

           return WinJS.xhr(options).then(
                //Callback for success
                function (request) {
                    var results = [], count;
                    console.log("request.responseText: " + request.responseText);
                    // Use the JSON parser on the results, safer than eval
                    var obj = JSON.parse(request.responseText);

                    console.log("obj: " + obj);

                    // Verify if the service has returned images
                    if (obj.length > 0) {
                        var items = obj;
                        console.log("returned items: " + items.length);
                        console.log("returned items: " +items[0].productid);
                        // Data adapter results needs an array of items of the shape:
                        // items =[{ key: key1, data : { field1: value, field2: value, ... }}, { key: key2, data : {...}}, ...];
                        // Form the array of results objects
                        for (var i = 0, itemsLength = items.length; i < itemsLength; i++) {
                            var dataItem = items[i];
                            var text = "aaa";
                            **var a = fetchPrice(dataItem.productid);**
                            console.log("shortText = " + a.text);
                            results.push({
                                key: (fetchIndex + i).toString(),
                                data: {
                                    productId: dataItem.productid,
                                    price: a
                                }
                            });
                        }

これまでのところ、問題はありません...すべての製品を取得したら、別のWebサービスを呼び出して、同じリストビューテンプレート内で製品の価格などを表示する必要があります。これについて最善の方法は何ですか?ご覧のとおり、もう 1 つの WinJS.xhr 呼び出しである fetchPrice などのコードを既に追加しています。これを行うより良い方法はありますか?価格の html 要素を、実行時にのみ使用可能になる productid にバインドできますか?

助けてください!

ありがとう、トーマス

--

実際にはもう少し進んだ:

                    var obj = JSON.parse(request.responseText);

                    console.log("obj: " + obj);

                    // Verify if the service has returned images
                    if (obj.length > 0) {
                        var items = obj;
                        console.log("returned items: " + items.length);
                        console.log("returned items: " + items[0].productid);
                        var priceText;
                        that.getPriceText(items[0].productid).done(function (b) { priceText = b; console.log("in function : " + priceText); });
                        console.log("priceText is " + priceText);
                        // console.log("var b = " + b.isPrototypeOf);
                        // Data adapter results needs an array of items of the shape:
                        // items =[{ key: key1, data : { field1: value, field2: value, ... }}, { key: key2, data : {...}}, ...];
                        // Form the array of results objects
                        for (var i = 0, itemsLength = items.length; i < itemsLength; i++) {
                            var dataItem = items[i];

                            results.push({
                                key: (fetchIndex + i).toString(),
                                data: {
                                    productId: dataItem.productid,
                                    price: priceText
                                }
                            });
                        }

console.log (console.log("priceTextis " + priceText)) という 2 行目のコンソール出力は undefined を返します。priceText の非同期呼び出しがまだ終了していないため、これは予期されることです。

非同期呼び出しの .done 関数内の priceText 出力は、コンソールに正しく出力されます。(行読み(「in function :」など)

アイテムが戻り配列にプッシュされている行の価格フィールドに、非同期呼び出しの値を直接渡すにはどうすればよいですか? 私はすでに価格を .done Promise の戻り値に設定しようとしました:

価格 : that.getPriceText(items[0].productid).done(function (b) { return b; })

ただし、私のWebAppでは、価格はまだ「未定義」です。すべてのアイテムを返す最初の約束が終了し、すべての結果が表示されるためだと思います。これは実際に私が望んでいることです: すべての製品の詳細を表示し、非同期で価格を取得します。これを達成するための最良の方法を誰かが提案できますか?

ありがとう!

4

0 に答える 0