2017-02-01 2 views
1

Ich habe einen Weg gefunden, Module asynchron zu laden, aber das Ergebnis sieht etwas unheimlich aus.Ist es möglich, die Versprechen innerhalb eines Versprechens zu vereinfachen?

export default Promise.all([ 
    // asynchronously load modules: 
    System.import('./details.js'), 
    System.import('./chartHelper.js'), 
    System.import('./dateHelper.js') 
]).then(promises => { 
    // modules returned promises, so resolve them: 
    Promise.all([ 
     promises[0].default, 
     promises[1].default, 
     promises[2].default 
    ]).then(modules => { 
     // assign modules to variables: 
     var details = modules[0]; 
     var chartHelper = modules[1]; 
     var dateHelper = modules[2]; 

     /* ...code dependent on loaded modules... */ 
    }); 
}); 

Gibt es eine Möglichkeit, ich dies vereinfachen kann?

Gibt es zum Beispiel einen syntaktischen Zucker, um ein Ergebnis des Versprechens zu lösen, wenn die Antwort des ursprünglichen Versprechens auch ein Versprechen ist? Oder kann ich hier zumindest benannte Eigenschaften anstelle von Array-Indizes verwenden?

Antwort

1

Zählt das als einfacher?

export default Promise.all([ 
    // asynchronously load modules: 
    System.import('./details.js'), 
    System.import('./chartHelper.js'), 
    System.import('./dateHelper.js') 
]).then(promises => 
    Promise.all(promises.map(promise => promise.default)) 
).then([details, chartHelper, dateHelper] => { 
    /* ...code dependent on loaded modules... */ 
}); 

(Übrigens, Sie hatten einen leichten Fehler: Sie den Wert aus der zweiten Promise.all() nicht tatsächlich zurückkehrten.)

+0

Sie haben Recht mit dem Fehler! Ich habe mich gefragt, warum es geladene Module statt "Code abhängig von geladenen Modulen" exportiert. –

2

Sie Lesbarkeit verbessern könnte so etwas tun:

export default Promise 
    .all(
    ['details', 'chartHelper', 'dateHelper'] 
     .map(m => (
     System.import(`./${m}.js`).then(m => m.default) 
    )) 
) 
    .then(([details, chartHelper, dateHelper]) => { 

    console.log({details, chartHelper, dateHelper}); 
    }) 
; 
+0

Ich mag die Prägnanz dieser, aber anscheinend mag Webpack keine Template-Literale und bricht bei 'System.import'. –

+0

Ich habe es selbst versucht und es funktioniert. – Hitmands

Verwandte Themen