【问题标题】:checking progress during promise在承诺期间检查进度
【发布时间】:2019-12-13 08:48:11
【问题描述】:

我有一个关于 javascript 的 promise api 的非常基本的问题。我有一个承诺电话,可能需要一段时间才能完成。在处理过程中,我想通过一些百分比加载信息来报告 UI 中的进度。 then() 方法只是指向 promise api 返回的时间。但是如何在处理过程中报告进度?

我尝试查看其他一些 stackoverflow 答案,但大多数情况下它们处理多个承诺,并使用 setTimeOut() api。我只有一个promise api,不知道可能需要多少时间(取决于我拨打电话时数据库中的数据)。由于我不知道可能需要多少时间,所以我也不确定如何显示百分比信息。有什么建议么?

我正在使用基本的 javascript,并在代码中剔除 observables,并且不能使用 react 或 angular(无权访问它)。

【问题讨论】:

  • 您总是可以显示“还有不到 2 个月的时间来完成”,这样一来,人们就会感到惊喜。抛开玩笑不谈,如果你没有估计完成,你想展示什么样的进步?此外,承诺没有进展。但是您可以设置一个回调以每隔一段时间处理一次,并告诉它正在发生的事情。

标签: javascript promise progress


【解决方案1】:

如果您不知道需要加载多少字节以及已经加载了多少字节,则无法显示任何正在进行的内容。最简单的方法是展示一些加载器等等。或者你只需​​要将你的主要承诺拆分成一个简单的和小的承诺。

【讨论】:

    【解决方案2】:

    我有一个关于 javascript 的 promise api 的非常基本的问题。

    有一个非常基本的答案; promise api 不支持“开箱即用”的进度。

    不知道可能需要多长时间(取决于我拨打电话时数据库中的数据)。

    没有这些信息,就不可能提供任何有意义的进展。您需要做的第一件事是快速调用数据库询问“需要如何加载 mch 数据”。然后,您应该以块的形式加载数据,并提供一种在累积数据时将加载的“Y 的块 X”传送回 UI 的方法。简而言之,这是“流式传输”数据的基本手段。

    这就是为什么,在你看到它完成的地方,他们使用多个承诺来完成,每个“进度承诺”都会在进度更新时解决,从而允许 UI 更新进度条。

    // fake promise to represent action which should take no more than 90s
    var promise = new Promise((resolve) => {
        setTimeout(resolve,20000);
    });
    
    // reference to progressbar
    var progressBar = document.querySelector('.progress');
    var current = 0;
    
    // repeating timer which updates every 5 secs
    var updater = setInterval(() => {
       if(current >= 100)
           clearInterval(updater);
       // update by 5/90ths
       var updateAmount = (5/90) * 100;
       current += updateAmount;
       progressBar.style.width = current + "%";
    },5000);
    
    // when the long action resolves, set the progress bar to 100 and stop the repeating event
    promise.then(() => {
       clearInterval(updater)
       progressBar.style.width = "100%";
       console.log("finished");
    });
    .progress-bar{
      width:100%;
      height:50px;
    }
    
    .progress{
       width:0%;
       height:100%;
       background-color:blue
    }
    <div class="progress-bar">
      <div class="progress"></div>
    </div>

    【讨论】:

    • 实际上,它是一个内部查询数据库的 REST API 调用。进行多个 REST API 调用可能会变得很昂贵。但我们确定的一件事是 REST API 调用的最大返回时间是 90 秒。那么,是否有可能显示一些进度,比如每 5 秒,如果数据返回速度超过 90 秒,是否可以提前完成进度?
    • 当然,只需每 5 秒(5/90 秒)移动一个进度条,并在承诺解决时将其设置为 100%。如果您只是想让您的用户被虚假的进度条占用,则无需报告实际进度
    猜你喜欢
    • 1970-01-01
    • 2020-01-29
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 2013-07-21
    • 2019-05-31
    • 1970-01-01
    相关资源
    最近更新 更多