sincronas promesas funciones encadenamiento ejemplo codigo await async asincrono asincronia asincronas javascript asynchronous module ecmascript-6 systemjs

javascript - promesas - Módulos asíncronos ES6 que utilizan múltiples baseurls



funciones asincronas jquery (2)

El sistema de módulos ES6 parece ser el adecuado para unificar las sintaxis CommonJs / AMD. Como usuario de requireJs / AMD me gustaría convertir a módulos ES6 (usando babel.js por el momento).

Parece que hay un problema; Al leer los documentos y tutoriales, no parece posible cargar paquetes de módulos que dependan de más de una baseurl. Usando requireJs esto se puede resolver usando el campo de context :

// async dependencies are loaded from http://path/to/domain var contextedRequire1 = require.config({ baseUrl: ''http://path/to/domain/js'', context: ''mainContext'' }); // async dependencies are located on http://path/to/otherdomain var contextRequire2 = require.config({ baseUrl: ''http://path/to/otherdomain/js'', context: ''pluginContext'' }); contextedRequire1([''main.js''], function(main){ // loaded using http://path/to/domain/js/main.js contextedRequire2([''plugin-lazyloading-deps.js''], function(plugin){ plugin.init(); }); });

En main.js

define([''main-deps''], function(mainDeps){ // loaded using http://path/to/domain/js/main-deps.js })

En plugin-lazyloading-deps.js

define([''require''], function(require){ // loaded using http://path/to/otherdomain/js/plugin-lazyloading-deps.js if(Modernizr.touch) { require([''hammer''], function(){ // loaded using http://path/to/otherdomain/js/hammer.js hammer.init(); }) } })

En el módulo asíncrono ES6, esto no es posible, ya que el System es un singleton

System.baseURL = "http://path/to/domain/js"; System.import("main").then(function(main){ // loaded using http://path/to/domain/js/main.js // This will potentially break when main.js tries to load hammer.js from http://path/to/domain/js System.baseURL = "http://path/to/otherdomain/js"; System.import("plugin-lazyloading-deps").then(function(){ /** code **/ }); });

Mi pregunta es: ¿hay algo en los documentos que haya pasado por alto (es posible que la subclase Sistema pueda configurar varias basesUrls), o esto está en proceso para futuras extensiones de módulos?



Parece como si System.js tuviera una forma (no documentada) extendiendo el objeto System utilizando Object.create(System) .

var context1 = Object.create(System); context1.baseURL = ''http://path/to/otherdomain/js''; context1.import(''plugin-lazyloading-deps'').then(function(m){ m.setSystem(context1); m.initialize(); ));

Tenga en cuenta que hasta que el objeto System se implemente en browsers / nodeJs, este enfoque puede romperse. Sin embargo, con suerte, el mismo efecto puede lograrse utilizando el class context1 extends System en ES6.

La implementación no es 100% análoga a requireJs, ya que no es posible inyectar el contexto actual para cargar de forma asíncrona otros módulos desde un contexto de ámbito (es decir, la dependencia ''require'' debe ser reemplazada por m.setSystem(..) o similar).