循环中的蓝鸟承诺
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
});
这段代码做什么其实并不重要,希望对你有所帮助。我刚刚添加了一条评论,只是为了在此处标记代码块(使用 X0
、X1
、XXX
等)
在旧代码中,所有这些块都是一个接一个。我不得不拆分它们,以某种方式将它们与 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,
});
我给了一个任务来恢复旧的 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
});
这段代码做什么其实并不重要,希望对你有所帮助。我刚刚添加了一条评论,只是为了在此处标记代码块(使用 X0
、X1
、XXX
等)
在旧代码中,所有这些块都是一个接一个。我不得不拆分它们,以某种方式将它们与 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,
});