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!!!');
}