segment-boneyard/nightmare

refactor: Simplify and improve the queue

Open

#1393 aperta il 28 feb 2018

Vedi su GitHub
 (0 commenti) (0 reazioni) (0 assegnatari)JavaScript (1076 fork)batch import
3.xHelp Wantedenhancement

Metriche repository

Star
 (19.507 star)
Metriche merge PR
 (Nessuna PR mergiata in 30 g)

Descrizione

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
  })
}

Guida contributor