为什么IListDataAdapter.getCount是异步的

时间:2014-03-04 11:09:28

标签: asynchronous windows-8 winjs windows-8.1

在WinJS中,获取ListView对象中项目计数的唯一方法是使用方法getCount()

但这种方法是异步的。

这使得在for循环中使用非常困难,例如当需要遍历列表中的项目时。

var listView = document.getElementById("listView").winControl;
listView.itemDataSource.getCount().done(
    function (numItems) {
        for (var i = 0; i < numItems; i++) {
            //do your stuff here
        }
    });

如果我把它放在我的代码的任何部分,我不能从任何函数返回我在循环中读取的值,因为getCount()返回一个promise,使我的函数也返回一个promise等等......

所以我的问题是为什么?调用方法时,列表中的项目数是否已知?

2 个答案:

答案 0 :(得分:3)

你试过joining promises吗?如果您关注的是通过索引选择每个项目然后对它们执行一些工作来迭代ListView中的所有项目,则可以使用WinJS.Promise.join创建包含所有操作结果的单个promise。 / p>

例如:

var listView = document.getElementById("listView").winControl;
listView.itemDataSource.getCount().then(
    function (numItems) {
        var joinedPromises = [];
        for (var i = 0; i < numItems; i++) {
            joinedPromises.push(listView.itemDataSource.itemsFromIndex(i, 0, 0));
        }
        return WinJS.Promises.join(joinedPromises);
    }).done(
    function (results) {
        // Operate on each item in the ListView's data source.
    },
    function (err) { 
        // Handle any errors from the joined promises.
    });

答案 1 :(得分:1)

ListView的数据协定允许异步数据源,我们包含一个基类VirtualizedDataSource,您可以将其用于这样的奇特场景。如果您使用WinJS.Binding.List作为数据源,那么API实际上是同步的,您应该能够说:

listView.itemDataSource.list.length

但是,如果您正在编写处理ListView的通用代码,并且不知道它将是什么类型的数据源