[英]Recursion with Asynchronous Functions and Bluebird Promises in JavaScript
在JavaScript中,我有四组函数:
Set_A
synchronousFunction_One
synchronousFunction_Two
synchronousFunction_Three
synchronousFunction_Four
synchronousFunction_Five
Set_B
objectA.asynchronousFunction_One
objectA.asynchronousFunction_Two
.
.
.
objectA.asynchronousFunction_N
Set_C
objectA.asynchronousFunction_Three
objectA.asynchronousFunction_Four
.
.
.
objectA.asynchronousFunction_M
Set_D
synchronousFunction_Six
我需要每个集合以特定的顺序并受一定的约束依次运行:
因此,实际上,我们在这里所做的就是等待一些外部承诺得到解决,然后我们可以说是一个函数“启动泵”。 然后,我们遍历对象接口的一部分,即“独立部分”,即只要有人喜欢就可以调用的方法。 然后,我们迭代该对象接口的另一部分“从属部分”(即,除非独立部分中的所有方法至少关闭了一次,否则从属部分中的所有方法都无法正确关闭)。 最后,我们调用清理函数。 完成此操作后,我们从Set_A中的下一个元素开始,然后再次灌注泵。
再次使用Bluebird Promise库,最高级别的抽象如下所示:
function doAllTheThings( externalPromise ) {
var Set_A, Set_B, Set_C; // Array<Function>
return new Promise( promiseToDoAllTheThings );
function promiseToDoAllTheThings( resolve, reject ) {
externalPromise.then( go );
function go() {
var primePump = Set_A.pop();
if ( !primePump ) return;
primePump();
callEverythingInSet_B()
.then( callEverythingInSet_C )
.then( cleanUp )
;
}
function callEverythingInSet_B() {
var promises = [];
for ( var index in Set_B )
promises.push( Set_B[index]() );
return Promise.all( promises );
}
function callEverythingInSet_C() {
var promises = [];
for ( var index in Set_C )
promises.push( Set_C[index]() );
return Promise.all( promises );
}
function cleanUp() {
// Do stuff
go();
}
}
}
我在这方面很难过。 昨天我花了几个小时进行分解和重构,每次都没有达到我预期的行为。 我仍在编写我的实际代码; 所以也许我会发现令我发疯的奇怪的分号或类似的东西。
但是与此同时,我想我应该在这里发帖问我-我是否正确理解Bluebird Promise库? 给定上面的代码,应该期待我描述的行为吗? 如果没有,您能否提供一些演示代码?
我的卵泡谢谢你。
是的,这似乎可行。 但是,一些技巧:
go()
函数的调用放在cleanUp
。 在go
函数本身中的.then(cleanUp)
之后.then(cleanUp)
它,从而使递归性质显而易见(并使引用保持局部)。 那
return new Promise( promiseToDoAllTheThings ); function promiseToDoAllTheThings( resolve, reject ) {
是错的。 返回的承诺不会被解决或拒绝,您不会使用这些回调。 但是,您甚至根本不应该在这里使用它们 。 只是忽略了promiseToDoAllTheThings
,只做一个
return externalPromise.then( go );
直。
for
循环,尝试使用Array::map
,它看起来会更好:-) Promise.each
而不是go
循环
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.