summaryrefslogtreecommitdiffstats
path: root/devtools/client/debugger/src/utils/task.js
blob: 25663fdd166b8e643bf2207544e072658a7b6e45 (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
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */

/**
 * This object provides the public module functions.
 */
export const Task = {
  // XXX: Not sure if this works in all cases...
  async: function (task) {
    return function () {
      return Task.spawn(task, this, arguments);
    };
  },

  /**
   * Creates and starts a new task.
   * @param task A generator function
   * @return A promise, resolved when the task terminates
   */
  spawn: function (task, scope, args) {
    return new Promise(function (resolve, reject) {
      const iterator = task.apply(scope, args);

      const callNext = lastValue => {
        const iteration = iterator.next(lastValue);
        Promise.resolve(iteration.value)
          .then(value => {
            if (iteration.done) {
              resolve(value);
            } else {
              callNext(value);
            }
          })
          .catch(error => {
            reject(error);
            iterator.throw(error);
          });
      };

      callNext(undefined);
    });
  },
};