gx
chenyc
2025-06-12 7b72ac13a83764a662159d4a49b7fffb90476ecb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/**
 * @license
 * Copyright 2019 Google Inc. All Rights Reserved.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * =============================================================================
 */
 
import {assert} from '../util';
 
import {OnProgressCallback} from './types';
 
/**
 * Monitor Promise.all progress, fire onProgress callback function.
 *
 * @param promises Promise list going to be monitored
 * @param onProgress Callback function. Fired when a promise resolved.
 * @param startFraction Optional fraction start. Default to 0.
 * @param endFraction Optional fraction end. Default to 1.
 */
export function monitorPromisesProgress(
    promises: Array<Promise<{}|void>>, onProgress: OnProgressCallback,
    startFraction?: number, endFraction?: number) {
  checkPromises(promises);
  startFraction = startFraction == null ? 0 : startFraction;
  endFraction = endFraction == null ? 1 : endFraction;
  checkFraction(startFraction, endFraction);
  let resolvedPromise = 0;
 
  const registerMonitor = (promise: Promise<{}>) => {
    promise.then(value => {
      const fraction = startFraction +
          ++resolvedPromise / promises.length * (endFraction - startFraction);
      // pass fraction as parameter to callback function.
      onProgress(fraction);
      return value;
    });
    return promise;
  };
 
  function checkPromises(promises: Array<Promise<{}|void>>): void {
    assert(
        promises != null && Array.isArray(promises) && promises.length > 0,
        () => 'promises must be a none empty array');
  }
 
  function checkFraction(startFraction: number, endFraction: number): void {
    assert(
        startFraction >= 0 && startFraction <= 1,
        () => `Progress fraction must be in range [0, 1], but ` +
            `got startFraction ${startFraction}`);
    assert(
        endFraction >= 0 && endFraction <= 1,
        () => `Progress fraction must be in range [0, 1], but ` +
            `got endFraction ${endFraction}`);
    assert(
        endFraction >= startFraction,
        () => `startFraction must be no more than endFraction, but ` +
            `got startFraction ${startFraction} and endFraction ` +
            `${endFraction}`);
  }
 
  return Promise.all(promises.map(registerMonitor));
}