【问题标题】:Why is IListDataAdapter.getCount asynchronous为什么 IListDataAdapter.getCount 是异步的
【发布时间】:2014-03-08 00:49:46
【问题描述】:

在 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() 返回一个承诺,使我的函数也返回一个承诺等等......

所以我的问题是为什么?调用方法时不是已经知道列表中的项目数了吗?

【问题讨论】:

  • listView 可以绑定到 StorageDataSource,这并不罕见。它迭代文件,速度慢到需要异步。不,listView 不会为您完成这项工作,它可以避免在视图中只有少数文件实际可见时消耗存储数千个文件所需的内存。很难看出这个问题的答案会有什么帮助。
  • 它很有用,因为目前还不清楚列表视图实际上只加载内存中的可见项。

标签: asynchronous windows-8 winjs windows-8.1


【解决方案1】:

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

例如:

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.
    });

【讨论】:

    【解决方案2】:

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

    listView.itemDataSource.list.length
    

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

    【讨论】:

      猜你喜欢
      • 2013-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-21
      • 1970-01-01
      • 2019-10-11
      • 2020-04-20
      • 1970-01-01
      相关资源
      最近更新 更多