簡體   English   中英

JavaScript中具有異步功能和Bluebird承諾的遞歸

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

我需要每個集合以特定的順序並受一定的約束依次運行:

  1. 在外部提供的promise解析之前,不能調用Set_A中的任何函數
  2. Set_A中的同步函數被迭代,每次調用一次
  3. 每次調用Set_A中的函數后,迭代器會暫停並等待下面的第4步和第5步解析,然后再移至Set_A中的下一個元素
  4. Set_B被迭代,並且每個方法都被調用一次,從而打開了幾個與Internet的異步連接
  5. 解決了第4步中的所有調用后,將遍歷Set_C並調用每個方法一次,從而再次打開與Internet的多個異步連接
  6. 解決完第5步中的所有調用后,上述第1步中的迭代器將移至Set_A中的下一個元素

因此,實際上,我們在這里所做的就是等待一些外部承諾得到解決,然后我們可以說是一個函數“啟動泵”。 然后,我們遍歷對象接口的一部分,即“獨立部分”,即只要有人喜歡就可以調用的方法。 然后,我們迭代該對象接口的另一部分“從屬部分”(即,除非獨立部分中的所有方法至少關閉了一次,否則從屬部分中的所有方法都無法正確關閉)。 最后,我們調用清理函數。 完成此操作后,我們從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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM