展示angulardart进步的最佳实践是什么?

展示angulardart进步的最佳实践是什么?,dart,progress-bar,future,progress,angular-dart,Dart,Progress Bar,Future,Progress,Angular Dart,我试图展示angulardart的进步,并认为未来会对这一点有利。但后来我意识到,未来必须是递归的,以显示进展,因为未来会立即返回,而冗长的操作会在之后执行 如果我创建了一个调用自身直到满足结束条件的未来,它将与progressbar一起工作。但是我认为这不是一个很好的实践,因为每次递归调用都会增加堆栈上的内存。只需考虑一个循环,它可以运行10亿个数据集,可以运行几个小时,每个循环在当前的将来调用一个新的未来。 有没有更好的方法来创建一个需要一定时间来处理每个元素的循环(包括调用必须异步完成的网

我试图展示angulardart的进步,并认为未来会对这一点有利。但后来我意识到,未来必须是递归的,以显示进展,因为未来会立即返回,而冗长的操作会在之后执行

如果我创建了一个调用自身直到满足结束条件的未来,它将与progressbar一起工作。但是我认为这不是一个很好的实践,因为每次递归调用都会增加堆栈上的内存。只需考虑一个循环,它可以运行10亿个数据集,可以运行几个小时,每个循环在当前的将来调用一个新的未来。 有没有更好的方法来创建一个需要一定时间来处理每个元素的循环(包括调用必须异步完成的网站和评估返回值)?在循环过程中,用户应该看到一个进度,显示“x/1000000完成”


我认为这必须用未来来完成,因为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这似乎是个好主意。我必须仔细查看流,但这可能符合我的目的。感谢您指出:)