knockout.js 是否有一个C#对应的javascript技巧,以避免过多的递归

wwwo4jvm  于 2022-11-10  发布在  C#
关注(0)|答案(1)|浏览(154)

在javascript中,当一个方法调用自身时,通过将递归调用 Package 在setTimeout中,可以防止“过多递归”错误。例如,下面的事件处理程序使用array.shift()和递归而不是循环,一次向可观察到的敲除数组中添加一项:

$(document).on("AddPizzaFan", function (event, data, results) {

    var item = data.shift();
    var fan =   new PizzaFan(

                     item['firstname'],
                     item['lastname'],
                     item['favoritePizzaTopping']

        )
    myObservableArray.push(fan);
    if (data.length > 0) {
        setTimeout(function () { $(document).trigger("AddPizzaFan", [data, myObservableArray]); }, 1);
    }

});

该方法允许绑定到KO可观测量的UI组件一次一个数据行地更新,从而即使当data包含数千行并且如果data数组被简单地一次全部馈送到UI则可能另外需要5或10或甚至60秒或更长时间来出现时,也使UI看起来快速且响应性强。当数组以许多小比特馈送到UI时,用户立即开始在屏幕上看到数据。(FWIW,实际的应用是文本语料库搜索,其中返回包含用户的搜索项或搜索短语的许多文本段落。)
在C#中使用Stack和async await可以完成类似的操作吗?阅读this question and answer时,似乎不能,至少不容易。如果可以在C#中完成类似的操作,它是如何完成的?

cetgtptt

cetgtptt1#

我认为你的代码可以用C#实现如下:
递归实现:

async Task RecursiveTask(Stack<object> data, Queue<object> myObservableArray)
{
    if (data.Count > 0)
    {
        myObservableArray.Enqueue(data.Pop()); // or any other logic
        await Task.Delay(1000);
        await RecursiveTask(data, myObservableArray);
    }
}

非递归实现(推荐):

async Task RecursiveTask(Stack<object> data, Queue<object> myObservableArray)
{
    while (data.Count > 0)
    {
        myObservableArray.Enqueue(data.Pop()); // or any other logic
        await Task.Delay(1000);
    }
}

相关问题