我有一个 Windows 8 JavaScript 应用程序,其中我将一个 VirtualDataSource 从 RESTful 服务中检索产品绑定到一个 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 服务来显示例如产品的价格,但在同一个列表视图模板中。解决这个问题的最佳方法是什么?如您所见,我已经添加了类似 fetchPrice 的代码,这是另一个 WinJS.xhr 调用。有没有更好的方法来做到这一点?我可以将价格 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)) 返回 undefined: 这是意料之中的,因为 priceText 异步调用尚未完成。
异步调用的 .done 函数中的 priceText 输出正确输出到控制台。(行阅读(“在函数中:”等)
如何将异步调用的值直接传递到将项目推送到返回数组的行中的价格字段?我已经尝试将价格设置为 .done Promise 返回值:
价格:that.getPriceText(items[0].productid).done(function (b) { return b; })
但是,在我的 WebApp 中,价格仍然是“未定义的”,我假设是因为第一个承诺返回所有已完成的项目并显示所有结果。这实际上是我想要的:显示所有产品详细信息,然后异步检索价格。谁能建议实现这一目标的最佳方法?
谢谢!