JavaScript中的异步函数递归和Bluebird Promises
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
我需要每个集合以特定的顺序和特定的约束一个接一个地运行:
- 在外部提供的promise解析之前,不能调用Set_A中的任何函数
- Set_A中的同步函数被迭代,每个调用一次
- 每次调用Set_a中的函数后,迭代器都会暂停并等待下面的步骤4和步骤5进行解析,然后再转到Set_a的下一个元素
- Set_B被迭代,每个方法被调用一次,打开几个到互联网的异步连接
- 一旦解决了步骤4中的所有调用,Set_C就会被迭代,每个方法都会被调用一次,再次打开与互联网的几个异步连接
- 一旦解决了步骤5中的所有调用,上面步骤1中的迭代器就移到Set_A中的下一个元素
因此,本质上,我们在这里所做的是等待一些外部承诺得到解决,然后我们称之为"启动泵"的函数。然后,我们迭代对象接口的一部分,即"独立部分"——可以随时调用的方法。然后,我们迭代该对象接口的另一部分,"依赖部分"(即,除非独立部分中的所有方法至少关闭一次,否则依赖部分中的任何方法都不会正确关闭)。最后,我们调用cleanup函数。完成后,我们从Set_A中的下一个元素开始,再次启动泵。
最高级别的抽象,再次使用Bluebird Promise Library,看起来是这样的:
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();
}
}
}
我真的很难过;昨天我花了几个小时进行分解和重构,每次都没有得到我期望的行为。我仍在编写我的实际代码;所以也许我会找到让我发疯的奇怪分号或类似的东西。
但与此同时,我想我应该把这个贴在这里,然后问——我对蓝鸟承诺图书馆的理解正确吗?给定上面的代码,是否应该期待我所描述的行为?如果没有,你能提供一些演示代码吗?
我的卵泡谢谢你。
是的,这似乎有效。然而,一些提示:
- 不要将对
go()
函数的调用放在cleanUp
中。在go
函数本身的.then(cleanUp)
之后将其链接起来,使递归特性显而易见(并保持引用的本地性) -
return new Promise( promiseToDoAllTheThings ); function promiseToDoAllTheThings( resolve, reject ) {
是错误的。返回的承诺永远不会被解决或拒绝,您不会使用这些回调。然而,你甚至不应该在这里使用它们。只需省略
promiseToDoAllTheThings
,只执行return externalPromise.then( go );
直接。
- 不要使用那些简单的
for
循环,试着使用Array::map
,它会看起来更好:-) - 您可以使用
Promise.each
而不是go
循环
相关文章:
- 可以简化嵌套的延迟Q Promises解析吗
- 承诺在非节点式回调上使用Bluebird
- Working with Ajax Promises / Deferred
- ExpressJS/NodeJS/Promises:从promise链提前返回
- 用Promises返回的数据替换出现的文本
- bluebird promise的while()循环正确(无递归?)
- JS Promises如何在内部工作
- 尝试使用Promises删除记录
- 生成器在与bluebird和co的express中起作用
- 如何使用bluebird将原始数据与Promise.map的响应一起传递
- Bluebird中承诺链数组的串行执行
- Backbone JS Promises在模型上设置属性之前解析
- JavaScript中的异步函数递归和Bluebird Promises
- 在Node.JS中使用Bluebird Promises,有2个异步操作
- 在Node.JS中使用Bluebird Promises
- Bluebird Promises:动态构建props对象,同时并行执行
- 如何将Async.js的每个系列示例转换为Bluebird Promises
- Node, Bluebird Promises, MySQL,以及对烈酒的需求
- done()和Javascript promises中的catch()一样(使用sequelize和bluebird)吗
- Javascript BlueBird Promises:并发API请求的架构