循环中的蓝鸟承诺

Bluebird promises in loop

我给了一个任务来恢复旧的 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 等)

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

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

您的代码几乎已准备就绪 - 您只需要将代码放在 X2 and X3 blobs won't be accessible here 的位置到链中的下一个 then - 因为 Promise.each(正确地)在a 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, 
});