docs: function runBrowsersBail(location, remote, platforms, options) {
    var throttle = options.throttle || function (fn) { return fn(); };
    var results = [];
    results.passedBrowsers = [];
    results.failedBrowsers = [];
    return new Promise(function (resolve) {
      function next(i) {
        if (i >= platforms.length) {
          return resolve(results);
        }
        var platform = platforms[i];
        if (options.onQueue) options.onQueue(platform);
        throttle(function () {
          if (options.onStart) options.onStart(platform);
          return runSingleBrowser(location, remote, platform, {
            name: options.name,
            capabilities: options.capabilities,
            debug: options.debug,
            httpDebug: options.httpDebug,
            jobInfo: options.jobInfo,
            allowExceptions: options.allowExceptions,
            testComplete: options.testComplete,
            testPassed: options.testPassed,
            timeout: options.timeout
          });
        }).done(function (result) {
          Object.keys(platform).forEach(function (key) {
            result[key] = platform[key];
          });
          results.push(result);
          if (options.onResult) options.onResult(result);
          if (result.passed) {
            results.passedBrowsers.push(result);
            next(i + 1);
          } else {
            results.failedBrowsers = [result];
            resolve(results);
          }
        }, function (err) {
          var result = {passed: false, duration: err.duration, err: err};
          Object.keys(platform).forEach(function (key) {
            result[key] = platform[key];
          });
          results.push(result);
          if (options.onResult) options.onResult(result);
          results.failedBrowsers = [result];
          resolve(results);
        });
      }
      next(0);
    });
  }