蓝鸟承诺循环

时间:2016-01-05 13:35:27

标签: javascript promise bluebird

我已经完成了恢复旧javascript代码的任务。新系统使用蓝鸟承诺。 我已经做了一些改变来使用它们,但我已经到了这一步,我不确定,如果我将要实现它的方式,将是最好的。

在这里,我将展示旧代码的片段:

[...] // 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
});

这段代码实际上并不重要,为您提供帮助。我刚刚添加了评论,只是为了标记代码块(使用X0X1XXX等等)

在旧代码中,所有这些块都是一个接一个。我不得不将它们分开,以某种方式将它们与承诺一起使用。

所以问题是 - 如何处理blob 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() ... 

1 个答案:

答案 0 :(得分:3)

您的代码已准备就绪 - 您只需将代码放在X2 and X3 blobs won't be accessible here所在的位置即可放到链中的下一个then - 因为Promise.each(正确地)在{ {1}}它不会到达该区域。

return