Lectura del código fuente: promesa

Lectura del código fuente: promesa

Introducción

En JavaScript, las funciones de devolución de llamada son una forma común de manejar operaciones asincrónicas. Sin embargo, el uso de funciones de devolución de llamada puede generar código que esté demasiado anidado para comprenderlo y mantenerlo. PromiseifyPara resolver este problema, puede convertir funciones asincrónicas basadas en devolución de llamadas en Promisefunciones devueltas, lo que facilita a los desarrolladores manejar operaciones asincrónicas y Promiseescribir código mediante llamadas en cadena, utilizando un código más claro y conciso para manejar operaciones asincrónicas.

PromiseifyEl uso es muy simple, simplemente llame a su función y pase la función asincrónica que necesita convertirse como parámetro. PromiseifyDevolverá una nueva función, esta nueva función devuelve un Promiseobjeto. Podemos realizar operaciones asincrónicas originales llamando a esta función devuelta y Promisemanejar resultados y errores mediante llamadas encadenadas.

promiseifyEl uso básico es el siguiente:

  1. Importe promiseifyel módulo (CommonJS como ejemplo):
const promiseify = require('promiseify');
  1. Pase la función que debe convertirse en promiseifyfunción y obtenga la Promiseversión devuelta de la función:
const promiseFunc = promiseify(callbackFunc);
  1. Utilice la función devuelta promiseFuncpara operaciones asincrónicas:
promiseFunc(args)
  .then((result) => {
    
    
    // 处理成功的结果
  })
  .catch((error) => {
    
    
    // 处理错误
  });

promiseifyEl principio de funcionamiento consiste en envolver la función de devolución de llamada original en una nueva Promisey determinar Promiseel estado en función del resultado de la ejecución de la función de devolución de llamada. Si la función de devolución de llamada se ejecuta correctamente, Promisese como un estado de éxito y se pasará el valor del resultado; si la función de devolución de llamada falla, Promisese rechazará y se pasará un objeto de error.

Interpretación del código fuente

'use strict';

Primero, el código utiliza el modo estricto ( 'use strict') para garantizar el rigor y la seguridad del código.

A continuación, se define una función promiseifyque acepta dos parámetros: methody ctx(opcional). methodEl parámetro es la función que necesita convertirse y ctxel parámetro es el contexto () que sirve como función this.

/**
 * promiseify
 * @param {function} method function
 * @param {object} ctx optional ctx for method
 */
function promiseify(method, ctx) {
    
    

  // check first
  if (typeof method !== 'function') {
    
    
    throw new TypeError(String(method) + ' is not a function');
  }

  return function() {
    
    

    // runtime args
    var args = [].slice.call(arguments);

    // runtime this
    ctx = ctx || this;

    return new Promise(function(resolve, reject) {
    
    

      args.push(function(err) {
    
    
        if (err) {
    
    
          return reject(err);
        }
        var arg = [].slice.call(arguments);
        if (arg.length === 2) {
    
    
          resolve.call(this, arg[1]);
        } else {
    
    
          resolve.call(this, arg.slice(1));
        }
      });

      try {
    
    
        method.apply(ctx, args);
      } catch (err) {
    
    
        reject(err);
      }
    });
  };
}
  1. El código primero realiza una verificación de parámetros para garantizar que el parámetro del método sea una función. Si no es una función, se genera un error de tipo.
  2. Luego, se devuelve una nueva función, que se convierte en la Promiseversión devuelta de la función.
  3. Dentro de la nueva función, primero obtenga los parámetros de tiempo de ejecución ( arguments) y conviértalos en una matriz.
  4. thisA continuación, establezca el contexto de ejecución de la función según el parámetro de contexto pasado o el contexto predeterminado ( ).
  5. Luego, cree uno nuevo Promisey Promisepase una nueva función de devolución de llamada como parámetro en el constructor. Esta función de devolución de llamada acepta dos parámetros: resolvey reject.
  6. En la función de devolución de llamada, primero verifique si hay un parámetro de error ( err), si hay un error, rejectel método será Promiserechazado y se pasará el objeto de error.
  7. Si no hay errores, utilice [].slice.call(arguments)Convertir los parámetros de la función de devolución de llamada en una matriz ( arg).
  8. resolveA continuación, los parámetros pasados ​​al llamar se determinan en función de la longitud de los parámetros . Si la longitud del parámetro es 2, significa que hay un parámetro de error y un parámetro de resultado. En este momento, resolvese llama al método y arg[1]se pasa el parámetro de resultado ( ); de lo contrario, resolvese llama al método y se pasa la matriz de parámetros de resultado ( arg.slice(1)). aprobado.
  9. Finalmente, try-catchla función asíncrona original ( method.apply(ctx, args)) se ejecuta en el bloque y, si ocurre un error, el rejectmétodo consumidor Promiselo rechazará y pasará el objeto de error.
/**
 * promiseify all
 * @param  {object} o the target object
 * @return {object}   same to target object
 *
 * @example
 *   var fs = promiseify.all(require('fs'));
 *   fs.readFileAsync('file.txt', 'utf8')
 *     .then(function(s){ console.log(s); });
 *
 *   var Connection = require('mysql/lib/Connection');
 *   promiseify.all(Connection.prototype);
 *   // conn.connectAsync / conn.queryAsync / conn.endAsync available now
 */
promiseify.all = function(o) {
    
    
  Object.keys(o)
    .filter(function(m) {
    
    
      return typeof o[m] === 'function';
    })
    .forEach(function(m) {
    
    
      o[m + 'Async'] = promiseify(o[m]);
    });
  return o;
};

Esta parte es una promiseify.allfunción que toma un objeto como parámetro y recorre en iteración todas las propiedades de ese objeto. Para atributos cuyo valor es una función, conviértalo a Promiseuna versión de la función y agregue la nueva función al objeto con el nombre de la función original más Asyncun sufijo.

Object.defineProperty(promiseify, "__esModule", {
    
     value: true });
promiseify.default = promiseify;
module.exports = promiseify;

Este código se utiliza principalmente para exportar promiseifyla función como módulo. Primero, use Object.definePropertyel método para promiseifyagregar una "__esModule"propiedad denominada al objeto con un valor de true. Esto es para indicar que el módulo es un módulo ES. A continuación, establezca promiseify.defaultla propiedad en promiseifyla función misma. De esta manera, cuando utilice importla importación de sintaxis, puede obtener promiseifyla función directamente. Finalmente, use module.exportsexportar promiseifyla función como módulo. requireDe esta forma, se puede obtener la función al utilizar la sintaxis import promiseify.

expandir

En JavaScript, un objeto similar a una matriz se refiere a un objeto que tiene las características de una matriz, pero no es una verdadera matriz. Tienen una propiedad de longitud similar a una matriz y la capacidad de acceder a elementos por índice. Sin embargo, los objetos tipo matriz no tienen los métodos y propiedades prototipo de las matrices.

Los objetos comunes similares a matrices incluyen:

  1. argumentsObjeto: un objeto creado automáticamente dentro de una función para almacenar los parámetros pasados ​​a la función.
  2. Lista de elementos DOM (NodeList): una colección de objetos devueltos al consultar elementos DOM, como querySelectorAlllos resultados obtenidos a través de métodos.
  3. Cadena: se puede acceder a los caracteres de una cadena mediante índice.
  4. Objetos similares a matrices: algunos objetos pueden diseñarse para parecerse a matrices, por ejemplo implementando una interfaz iteradora similar a una matriz.

Hay varias formas de convertir un objeto similar a una matriz en una matriz real:

  1. Uso Array.from(): Array.from()El método puede convertir un objeto similar a una matriz o un objeto iterable en una nueva matriz. Por ejemplo:var array = Array.from(arrayLike);
  2. Utilice el operador de extensión (Operador de extensión): el operador de extensión (...) puede extender un objeto similar a una matriz en una nueva matriz. Por ejemplo:var array = [...arrayLike];
  3. Uso : Puede convertir un objeto similar a una matriz en una matriz Array.prototype.slice.call()llamando al método y pasando un objeto similar a una matriz como contexto. Array.prototype.slicePor ejemplo:var array = Array.prototype.slice.call(arrayLike);
  4. Uso Array.prototype.concat(): Puede convertir un objeto similar a una matriz en una matriz llamando Array.prototype.concatal método y pasando un objeto similar a una matriz como parámetro. Por ejemplo:var array = Array.prototype.concat.call([], arrayLike);

Cabe señalar que todos los métodos anteriores crean una nueva matriz en lugar de modificar directamente el objeto original similar a una matriz.

Supongo que te gusta

Origin blog.csdn.net/p1967914901/article/details/132024074
Recomendado
Clasificación