Welcome to mirror list, hosted at ThFree Co, Russian Federation.

tappable_promise.js « utils « lib « javascripts « assets « app - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 8d327dabe1bd14624d4dae0c848a5685d4268ebd (plain)
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
/**
 * A promise that is also tappable, i.e. something you can subscribe
 * to to get progress of a promise until it resolves.
 *
 * @example Usage
 *   const tp = new TappablePromise((resolve, reject, tap) => {
 *     for (let i = 0; i < 10; i++) {
 *       tap(i/10);
 *     }
 *     resolve();
 *   });
 *
 *  tp.tap((progress) => {
 *    console.log(progress);
 *  }).then(() => {
 *    console.log('done');
 *  });
 *
 *  // Output:
 *  // 0
 *  // 0.1
 *  // 0.2
 *  // ...
 *  // 0.9
 *  // done
 *
 *
 * @param {(resolve: Function, reject: Function, tap: Function) => void} callback
 * @returns {Promise & { tap: Function }}}
 */
export default function TappablePromise(callback) {
  let progressCallback;

  const promise = new Promise((resolve, reject) => {
    try {
      const tap = (progress) => progressCallback?.(progress);
      resolve(callback(tap, resolve, reject));
    } catch (e) {
      reject(e);
    }
  });

  promise.tap = function tap(_progressCallback) {
    progressCallback = _progressCallback;
    return this;
  };

  return promise;
}