展示angulardart进步的最佳实践是什么?
我试图展示angulardart的进步,并认为未来会对这一点有利。但后来我意识到,未来必须是递归的,以显示进展,因为未来会立即返回,而冗长的操作会在之后执行 如果我创建了一个调用自身直到满足结束条件的未来,它将与progressbar一起工作。但是我认为这不是一个很好的实践,因为每次递归调用都会增加堆栈上的内存。只需考虑一个循环,它可以运行10亿个数据集,可以运行几个小时,每个循环在当前的将来调用一个新的未来。 有没有更好的方法来创建一个需要一定时间来处理每个元素的循环(包括调用必须异步完成的网站和评估返回值)?在循环过程中,用户应该看到一个进度,显示“x/1000000完成”展示angulardart进步的最佳实践是什么?,dart,progress-bar,future,progress,angular-dart,Dart,Progress Bar,Future,Progress,Angular Dart,我试图展示angulardart的进步,并认为未来会对这一点有利。但后来我意识到,未来必须是递归的,以显示进展,因为未来会立即返回,而冗长的操作会在之后执行 如果我创建了一个调用自身直到满足结束条件的未来,它将与progressbar一起工作。但是我认为这不是一个很好的实践,因为每次递归调用都会增加堆栈上的内存。只需考虑一个循环,它可以运行10亿个数据集,可以运行几个小时,每个循环在当前的将来调用一个新的未来。 有没有更好的方法来创建一个需要一定时间来处理每个元素的循环(包括调用必须异步完成的网
我认为这必须用未来来完成,因为UI需要在启动循环后重新加载,但对我来说,递归未来似乎不是一个好主意。你需要在web上立即将未来返回给你,因为它是一个单线程平台。如果异步操作直到完成才返回,那么您将挂起浏览器,这对用户来说并不是一个很好的体验 相反,您有两个选择: Dart能够使未来看起来与WAIT关键字同步。因此,您可以执行以下操作:
void performAction() async {
showProgress = true;
await expensiveRpc();
showProgress = false;
}
这将要求进度是中间的,因为您实际上并不是在更新进度条。也就是说,如果您没有真正从RPC获取进度事件,这可能是更好的解决方案
现在,如果您的RPC或操作在运行时给您一些反馈,那么您可以使用流做一些更好的事情
void performAction() {
showProgress = true;
expensiveRpc().listen((progress) {
if (progress.done) {
showProgress = false;
} else {
percentComplete = progress.value;
});
}
实际上,它更多地取决于与之交互的RPC或服务,而不是进度本身。同时,我认识到未来的方法会立即返回,而不会在方法体中执行任何操作。因此,解决方案非常简单: 只需声明具有未来的rpc,在方法中执行您需要执行的任何操作,并且在调用它时,使用then(…)在收集数据后执行您需要执行的操作
int progress = 0;
int progressMax = 100;
bool progressCanceled = false;
Future rpc(var data)
async{
for(progress=0; progress<progressMax, progress++)
{
// do whatever you need to do with data
if(progressCanceled)
return;
}
}
rpc(data).then(
{
if(progressCanceled)
return;
// do whatever is needed after having received that data
});
int progress=0;
int progressMax=100;
bool=false;
未来rpc(var数据)
异步的{
对于(progress=0;progress这似乎是个好主意。我必须仔细查看流,但这可能符合我的目的。感谢您指出:)