F#Silverlight RPC:预填充分页数据

F#Silverlight RPC:预填充分页数据,f#,F#,感谢过去几个月来帮助我启动silverlight/f#原型(从VS-Ugh的RC版本开始)的所有人。我们试图解决的最后一个问题是RPC问题 我们需要能够对RPC调用进行分页,以便请求并绑定到网格并显示第一个页面,同时在后台预先填充otehr页面并将其连接在一起。我猜psuedo代码应该是这样的: let pageNo = 1 let page1Data = JsonRpc.getSomeData(pageNo) let grid.datasource <- page1Data let

感谢过去几个月来帮助我启动silverlight/f#原型(从VS-Ugh的RC版本开始)的所有人。我们试图解决的最后一个问题是RPC问题

我们需要能够对RPC调用进行分页,以便请求并绑定到网格并显示第一个页面,同时在后台预先填充otehr页面并将其连接在一起。我猜psuedo代码应该是这样的:

let pageNo = 1
let page1Data  = JsonRpc.getSomeData(pageNo)

let grid.datasource <- page1Data
let grid.suspendFiltering <- true

// run the remainder in background
let allData : list ref = page1Data ref
for pageNo in [2..totalPages]
    allData := allData @ JsonRpc.getSomeData(pageNo)

let grid.datasource <- allData
let grid.suspendFiltering <- true
让pageNo=1
让page1Data=JsonRpc.getSomeData(pageNo)

让grid.datasourcehmm。。。像这样的?(在浏览器中键入可能包含错误):


嗯。。。这个问题我已经读了一遍又一遍,不知道问题出在哪里。如果您想获取整个数据集,请公开一个
JsonRpc.getAllData
方法来实现这一点。您的评论“另一个缺陷是需要使用回调将数据绑定到网格”没有上下文,因为据我所知,您的
JsonRpc.getSomeData
方法看起来像一个同步方法,任何地方都没有回调的引用。唯一与众不同的是在循环中使用
@
而不是更惯用的
[yield!page1Data;因为totalPages中的pageNo确实yield!getSomeData(pageNo)]
我明白了(没有我需要的那么清楚)-假设每个分页请求需要2秒钟才能完成。如果我有10个页面,那么用户等待获取所有数据的时间就太长了。所以我想显示第一页,并在后台填充数据集的其余部分。在本例中,为了简单起见,我省略了回调。即使在一个更简单的模型中,我仍然需要显示一页数据,获取所有数据,然后将网格重新绑定到整个集合。。。这说明问题了吗?谢谢-这看起来像是我正在考虑实施的设计之一。我们只需在P1和afetr Pn之后调用两次“回调”。我不熟悉异步模块的细节,但它读起来很直接,我可以深入查找。非常感谢。还有人对这个设计有想法吗?
module Loader

open System
open System.Threading

let totalPages = 20

// emulation of long-running data loading routine
let private loadPageData (page : int) = 
    async {
        do! Async.Sleep(1000)
        return List.replicate 5 page
    }

// loader - notifies UI about new data via callback
let loadAsync (callback : System.Action<_>) = 
    let syncContext = SynchronizationContext.Current
    let doLoad = async {

        // load first page and immediately feed it to callback
        let! page1Data = loadPageData 1

        do! Async.SwitchToContext syncContext
        callback.Invoke(ResizeArray<_>(page1Data))

        // load remaining data in the background 
        do! Async.SwitchToThreadPool()
        let allData = ResizeArray<_>(page1Data)            

        for page in 2..totalPages do
            let! pageData = loadPageData page
            allData.AddRange(pageData)

        do! Async.SwitchToContext syncContext
        callback.Invoke(allData)
        }

    Async.Start doLoad
Loader.loadDataAsync(list => data.ItemSource = list)