2016-01-05 3 views
3

Я поставил задачу восстановить старый код javascript. Новая система использует обещания bluebird. Я сделал несколько изменений, чтобы использовать их, но я получил на этом этапе, и я не уверен, что, если я это пойму, будет лучшим.Bluebird обещает в цикле

Здесь я покажу фрагмент старого кода:

[...] // X0 
.then(function(){ 
    [...] //X1 

    // XXX 
    if (assesment.data.AssesmentType == "1" || assesment.data.AssesmentType == "4") { 
     for (var i = 0; i < assesment.data.Compartments.length; i++) { 
      for (var b = 0; b < assesment.data.Compartments[i].Species.length; b++) { 
       assesment.assortmentRow(assesment.data.Compartments[i].Species[b], false); 
       // assesment.assortmentRow makes ajax request and does other studd 
       // and now returns a promise 
      } 
     } 
    } 
    // X2 
    if (assesment.data.AssesmentType != "2") { 
     var asortRowRadioBtn = $("#assesment-assortment-compartments input[type='radio']").eq(0); 
     asortRowRadioBtn.prop("checked", true); 
     asortRowRadioBtn.trigger("click"); 
    } 
    [...] //X3 
}); 

Что делает этот код на самом деле не важно, для вас, чтобы помочь. Я только что добавил комментарии, просто для обозначения блоков кода здесь (X0, X1, XXX и т. Д.)

В старом коде все эти блоки были одно за другим. Мне пришлось разбить их, чтобы как-то использовать их с обещаниями.

Так что вопрос - что делать с сгустка XXX

Одна вещь, которую я могу думать -

[...] // X0 
.then(function(){ 
    [...] //X1 
    // new XXX 
    if (assesment.data.AssesmentType == "1" || assesment.data.AssesmentType == "4") { 
     return Promise.each(assesment.data.Compartments, function(i) { 
      return Promise.each(assesment.data.Compartments[i].Species, function(b) { 
       return assesment.assortmentRow(assesment.data.Compartments[i].Species[b], false); 
      }); 
     }); 
    } 
    //X2 and X3 blobs wont be accessible here. 
    //So should I bring them inside next .then() function ? 
    //And is it OK for X1 blob and XXX to be in the same then()? 
}) 
.then(function() ... 

ответ

3

Ваш код почти готов - нужно просто поместить код, где он говорит X2 and X3 blobs won't be accessible here к следующему then в цепи - поскольку Promise.each (по праву) в return, он не достигнет этой области.

[...] // X0 
.then(function(){ 
    [...] //X1 
    // new XXX 
    if (assesment.data.AssesmentType == "1" || assesment.data.AssesmentType == "4") { 
     return Promise.each(assesment.data.Compartments, function(comp) { 
      return Promise.each(comp.Species, function(b) { 
       return assesment.assortmentRow(b, false); 
      }); 
     }); 
    } 
}) 
.then(function(val) { 
    // x2 and x3 code parts go here, 
}); 
+0

Но действительно ли, чтобы положить 'X1', где он находится, не так ли? В любом случае, я думаю о том, чтобы вывести его на улицу (прежде). Так же, как 'X2', он не возвращает обещание, но, imo, выглядит уродливо, чтобы разбить код после' XXX', но не после 'X1' только потому, что он не возвращает обещание. – Wish

+0

Если X1 синхронизирован и не прекращает управление (возврат), тогда да. Если я могу спросить - это код в NodeJS? Если да, используете ли вы сравнительно недавнюю версию, а не древнюю? (Скажем, 4+) –

+0

Нет, он запускается в браузере для веб-страницы. – Wish

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