繁体   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