Javascript 系统导入承诺链

Javascript 系统导入承诺链,javascript,promise,ecmascript-6,systemjs,Javascript,Promise,Ecmascript 6,Systemjs,我偶然发现了一些片段: 这是对地狱的替代——承诺地狱吗?是否可以将sequentialSystem.import展平以使用承诺链接,或者可能存在问题?我建议使用链接,例如 System.import('core-js') .then(function(){ return System.import('polymer/mutationobservers'); }) .then(function(){ return System.import(

我偶然发现了一些片段:


这是对地狱的替代——承诺地狱吗?是否可以将sequential
System.import
展平以使用承诺链接,或者可能存在问题?

我建议使用链接,例如

System.import('core-js')
    .then(function(){
        return System.import('polymer/mutationobservers');
    })
    .then(function(){
        return System.import('aurelia-bootstrapper');
    });

当您
然后
返回一个承诺时,它将等待该承诺得到解决,然后再执行下一个
然后
,因此在这种情况下
变异观察者必须在
aurelia bootstrapper
之前加载,因为System.import返回一个承诺,请使用一组承诺。我发现这比链锁更直接

Promise.all([
    System.import('core-js'),
    System.import('polymer/mutationobservers'),
    System.import('aurelia-bootstrapper')
]).then(function(modules) {
    var corejs = modules.shift(),
        mutationobservers = modules.shift(),
        aureliaBootstrapper = modules.shift()
    ;

    // You code goes here.
});

在这种情况下,我更喜欢async/await,但是您需要在异步函数中,该函数可能并不总是适用于import语句

function async doStuff () {
    await System.import('core-js');
    await System.import('polymer/mutationobservers');
    await System.import('aurelia-bootstrapper');
    console.log('everything done!!!');
}

@torazaburo我只是引用了现有的代码片段,但是是的,这三个模块是相互依赖的。前两个是polyfill库,如果需要,则由开发人员选择。@torazaburo他链接到代码所在的位置。它明确指出,如果您想要IE9支持,就必须加载它们,但它们是可选的。该片段直接来自Aurelia网站。由于它们是多填充的,并且依赖于全局存在,所以它们确实相互依赖。@estus-承诺不幸被广泛误解,所以是的,您会经常遇到这样的代码。这就是说,有合法的方法来避免回叫地狱-同样的人创造了大量的回调可能没有问题创造山的承诺。所以我想知道这背后是否有什么原因。我想这里的问题是前两个是polyfill库。但除此之外,是的,这将是
Promise.all
的一个很好的用例。使用es6解构,您可以避免使用
modules.shift()
分配模块变量,例如
。然后([corejs,mutationobserver,aureliaBootstrapper])=>{//您的代码…
function async doStuff () {
    await System.import('core-js');
    await System.import('polymer/mutationobservers');
    await System.import('aurelia-bootstrapper');
    console.log('everything done!!!');
}