Javascript WinJS.Binding.List.createFiltered:谓词中的异步调用

Javascript WinJS.Binding.List.createFiltered:谓词中的异步调用,javascript,windows-8,windows-store-apps,winjs,Javascript,Windows 8,Windows Store Apps,Winjs,下面代码中的谓词将始终返回false。 我的问题是如何“等待”异步操作并将该结果用作谓词结果 return someList.createFiltered(function(item) { var filter = false; var promise = someOperationAsync(); promise.done(function(b) { filter

下面代码中的谓词将始终返回false。 我的问题是如何“等待”异步操作并将该结果用作谓词结果

return someList.createFiltered(function(item) {                        
         var filter = false;
         var promise = someOperationAsync();

         promise.done(function(b) {
              filter = b;
         });

         return filter;
});

您需要返回承诺,然后从调用函数调用“then”或“done”


或者,您可以放置
返回过滤器在promise.done部分中,但实际上它将同步运行,因为您将在返回之前等待promise的结果

很遗憾,WinJS.Binding.List中不支持异步谓词。我能想到的唯一方法——即同步阻止UI线程——是坐在最后的一个循环中,观察在完成的处理程序和错误处理程序中设置的布尔标志(在本例中,您必须使用promise上的错误处理程序来更改该标志)


您试图通过异步调用实现什么?当应用程序启动时,是否可以缓存这些结果,以便您可以对缓存的数据进行同步查找?

Hm,返回承诺并等待是否更好?在这种情况下,这不起作用,因为projection类(FilteredListProjection)中的方法假定它可以同步调用谓词,谓词返回预期结果,而不是承诺。将return语句放在promise.done中不会做任何事情,因为返回值进入WinJS.promise实现,而不是外部调用方。啊,好的,我不知道promise不能从谓词返回。在将结果返回到createFiltered函数之前,是否将返回放在Promission.done中等待Promission的done方法?谓词返回true或false以指示该项是否包含在筛选的投影中。指定给承诺的已完成处理程序不会从promise.done或promise.then返回该值。使用promise.then,完成的处理程序的返回值将是promise.then返回的不同承诺所传递的值,但这是用于链接承诺,而不是在此处尝试返回值。这段代码只是简化了我的问题:)我正在尝试使用一些文本的翻译来更新该项,为了获得翻译,我使用了一个异步的webservice调用。我用转换器尝试过,但不支持从转换器返回承诺。在那之后,我尝试使用这个(黑客)方法。两者都有相同的问题,“等待承诺”。为什么要使用过滤器呢?为什么不更新底层数据呢?你问了一个好问题——过滤器的目的是缩小过滤投影中可用的项目,其返回值是布尔值(true表示将项目包括在投影中,false表示排除)。因此,它根本不意味着修改列表中的值——这应该直接在数据源中完成,并且由于数据绑定,它将更新ListView以及任何其他投影(包括过滤的投影)。执行这些转换的代码可能发生在其他地方,并且涉及异步调用。