Issue #851✓ ResueltoAbierto el 8 de febrero de 2018por maxtaccoReacciones 3

Plugins de retorno de promesas

Respuesta rápidapor nashton1093

Yo tenía un requisito similar. Si sirve de ayuda, mi solución al final fue crear un plugin que luego cargue mis otros plugins; La configuración del editor solo referenciaría ese plugin y las opciones de plugin para ese plugin contendrían los plugins y las opciones para que los demás se carguen. El código del plugin; '...

Lee la respuesta completa abajo ↓

Pregunta

Hola @artf, Tengo un caso en el que un plugin personalizado necesita comprobar los permisos de usuario antes de hacer cualquier tipo de inicialización. El método que realiza la comprobación devuelve una Promesa, así que tengo que esperar a que se resuelva antes de hacer nada. Desafortunadamente, esto crea una condición de elevación con el renderizado del editor y la interfaz entra en un estado extraño. Para solucionar este problema tengo que poner 'editor.autorender' en false y luego renderizar editor manualmente una vez que mi plugin esté inicializado. Esto está bien por ahora, pero no estoy muy seguro de cómo manejaría este caso si tuviera varios plugins personalizados dependiendo de alguna lógica asíncrona.

Así que sería muy bueno que GrapesJS pudiera comprobar si alguno de los plugins registrados devuelve Promises y solo renderizar el editor cuando todos estén resueltos.

Gracias por tu increíble proyecto.

Respuestas (3)

👍 Muy útilnashton10913 de julio de 2019

Yo tenía un requisito similar. Si sirve de ayuda, mi solución al final fue crear un plugin que luego cargue mis otros plugins;

La configuración del editor solo referenciaría ese plugin y las opciones de plugin para ese plugin contendrían los plugins y las opciones para que los demás se carguen.

El código del plugin; '''js exporta por defecto grapesjs.plugins.add("async-plugins", async (editor, opts) => { /** * opts = { * plugins: [ ... ] * pluginsOpts: { ... }, * render: true | false, // Si no se configura, esto será predeterminado como verdadero. * onFinished: async (editor) => { * // Cuando el plugin asincrónico ha terminado. * }, * }; * * Si usas el 'render' aquí, asegúrate de poner 'autorender' en false en la configuración del editor. */ Carga los plugins especificados. para (sea i = 0, len = opts.plugins.length; i < len; i++) { const pluginId = opts.plugins[i]; if (!opts.pluginsOpts) { opts.pluginsOpts = {}; } Intenta conseguir el plugin si ya está registrado. let plugin = grapesjs.plugins.get(pluginId); if (!plugin) { const wplg = window[pluginId]; plugin = wplg & & wplg.default ? wplg.default : wplg; } Intenta ejecutar el plugin usando 'await'. If (plugin) { await plugin(editor, opts.pluginsOpts[pluginId] || {}); } else if (pluginId instancia de Function) { await pluginId(editor, {}); } else { console.warn('No se ha podido cargar el plugin ${pluginId}.'); } } Renderiza el editor si este plugin ha sido configurado para ello. si (opts.render === indefinido || opts.render === true) { editor.render(); } Si hay una llamada 'onFinished', dale. if (opts.onFinished) { await opts.onFinished (editor); } });


El código de init del editor;
'''js
grapesjs.init({
  ...
  autorender: false,
  Plugins: [ 'Async-plugins' ],
  pluginsOpts: {
    'async-plugins': {
      Plugins: [ ... ],
      pluginsOpts: { ... },
      Render: Cierto,
      onFinished: async (editor) => {
        console.log("TERMINADO");
      },
    },
  },
  ...
});
maxtacco8 de febrero de 2018

Además, esto puede requerir que el método init de GrapesJS devuelva una Promesa en lugar del editor, pero esto solo puede limitarse a los casos en que existan plugins que devuelvan Promesas.

artf9 de febrero de 2018

tengo que poner 'editor.autorender' en falso y luego renderizar editor manualmente una vez que se inicialice mi plugin. Esto está bien por ahora, pero no estoy muy seguro de cómo manejaría este caso si tuviera varios plugins personalizados que dependieran de alguna lógica asíncrona

Solo usa una variable como indicador que cuenta tu lógica de ejecución personalizada y, una vez terminada, estás listo para renderizarla. En mi humilde opinión, la solución con Promises es absolutamente abrumadora para algo así

Preguntas y respuestas relacionadas

Continúa investigando con debates sobre temas similares.

Plugins de pago que cumplen con este problema

Seleccionado por temas clave y relevancia de etiquetas para ayudarte a enviar más rápido.

Ver todos los plugins

Cargando recomendaciones de plugins de pago...

Opción gratuita

Consulta los plugins de código abierto de GrapesJS en GitHub O haz una búsqueda rápida en nuestro catálogo gratuito.

Explora plugins gratuitos →
Opción premium

Los plugins premium incluyen soporte, actualizaciones regulares y funciones listas para producción — ahorrando días de trabajo de integración.

Explora plugins premium →

Explorar categorías de plugins

Ve directamente a las páginas de categorías de plugins en el marketplace.