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