[英]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.