2015-08-15 4 views
3

Я наткнулся на некоторых фрагментах similar to this one:System.import обещание СЦЕПЛЕНИЕ

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

ли это замена для обратного вызова ад - это обещание ад? Может ли последовательный System.import сгладить, чтобы использовать цепочку обещаний, или могут быть проблемы с этим?

+0

@torazaburo Я просто цитирую существующий фрагмент кода, но да, эти 3 модуля зависят друг от друга. Первые два являются полисполными библиотеками, это выбор разработчика, если они требуются. – estus

+0

@torazaburo Он связан с местоположением, в котором находится код. В нем явно говорится, что вы должны загружать их, если хотите поддержку IE9, но они являются необязательными. Фрагмент находится непосредственно на веб-сайте Aurelia. Они зависят от eachother благодаря наличию полиполнений и полагаются на присутствующие глобалы. – loganfsmyth

+0

@estus - обещания, к сожалению, широко недопоняты, так что да, вы столкнетесь с таким кодом, как это довольно много. Это, как говорится, есть законные способы избежать обратного вызова ада - и те же люди, которые создали горы обратных вызовов, вероятно, не создают проблем с созданием гор обещаний. – aaaaaa

ответ

9

Я бы рекомендовал вместо этого цепочку, например.

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

Когда вы return обещания от then, он будет ждать, что для разрешения перед выполнением следующего then, так что в этом случае mutationobservers необходимо загрузить перед тем aurelia-bootstrapper.

1

Поскольку 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. 
}); 
+0

Я предполагаю, что проблема здесь в том, что первые две являются полисполными библиотеками. Но кроме этого, да, это было бы хорошим вариантом для 'Promise.all'. – estus

+0

Используя es6 destructuring, вы можете не использовать 'modules.shift()' для назначения переменных модуля, например. '. .then (([corejs, mutationobservers, aureliaBootstrapper]) => {// ваш код ...' ' – webXL

Смежные вопросы