segment-boneyard/nightmare

refactor: Simplify and improve the queue

Open

#1.393 aberto em 28 de fev. de 2018

Ver no GitHub
 (0 comments) (0 reactions) (0 assignees)JavaScript (1.076 forks)batch import
3.xHelp Wantedenhancement

Métricas do repositório

Stars
 (19.507 stars)
Métricas de merge de PR
 (Nenhuma PRs mesclada em 30d)

Description

Now that promises are widespread, we can revisit the queueing logic and simplify it a lot. I think this can be done in a non-breaking way. It's basically just one long promise chain, with a little "thenable" magic to support chaining. Here's an example implementation:

function Nightmare(options) {
  if (!(this instanceof Nightmare)) return new Nightmare(options)
  this._options = options || {}
  this._queue = Promise.resolve()
}

/**
 * enqueues the actions
 *
 * @api private
 */

Nightmare.prototype._enqueue = function(fn) {
  this._queue = this._queue.then(() => new Promise(fn))
  return this
}

/**
 * Nightmare implements .then() to create a "thenable"
 */

Nightmare.prototype.then = function(success, failure) {
  return this._queue.then(success).catch(failure)
}

/**
 * Nightmare implements .catch() to create a "thenable"
 */

Nightmare.prototype.catch = function(failure) {
  return this._queue.catch(failure)
}

/**
 * Goto action
 */

Nightmare.prototype.goto = function(url) {
  return this._enqueue((resolve, reject) => {
    // goto implementation
  })
}

Guia do colaborador