从递归调用中返回Promise

时间:2018-08-28 10:42:46

标签: javascript recursion promise

所以,这确实是我正在描述的一个非常愚蠢的情况,但是我正在使用的代码正在执行它,而我现在正在重写它或找到一种处理它的方法。 我的问题所涉及的流程如下:

功能A调用功能B。然后,在功能A调用之后,功能B调用自身。然后,在此递归调用中,函数B调用函数C。函数C返回一个Promise。

我要做的是“传播”函数C一直返回到函数A的承诺。 从理论上讲,我已经有语法可以做到这一点,但是我不知道这是否真的可能实现,尤其是通过函数B的递归调用。

我只想知道这是否可能,如果可以,我该怎么做。我可以理解,如果您觉得它很棒,我也可以,但是我必须以某种方式使用它,除非没有其他选择,否则我想让我完全检查一下这段代码。

编辑:这是代码,我在代码的关键部分周围放置了一些很大的空格,因此您可以轻松找到所需的内容。

async function getTable(start, ende, liebraum)
{


   $.post("../include/returnTable.php", {
    anfang: start,
    ende: ende,
    art: art
  }).then((data) => {
                      document.getElementById("tablediv").innerHTML = data
                     })
  //return promiseToBeReturnedFromGetTable;
  return fillRooms(liebraum);
}



async function fillRooms(liebraum)
{
    var bool = false
				if (!bool)
				{
					bool = !bool;
					fillRooms(liebraum);
				}
		else
		{
      return Disablen(liebraum);
		}



	async function Disablen(liebraum)
	{
			if(usecase1)
			{
				return $.post('../include/getSitzOptions.php',{
 	    				raum: tisch,
      					art: art,
					start: anfang,
					ende: ende
        }).then((data) => {
                $('#sitz').html(data);
                })
			}
			else if(usecase2)
			{
				return $.post('../include/getSitzOptions.php',{
     					raum: tisch,
      					art: art,
					tagStart: tagAnfang,
					tagEnde: tagEnde
        }).then((data) =>{
                $('#sitz').html(data);
                })
			}
			else if(usecase3)
			{
				return $.post('../include/getSitzOptions.php',{
     					raum: tisch,
      					art: art,
					WeekStart: WochenStart,
					WeekEnd: WochenEnde
        }).then((data) => {
                $('#sitz').html(data);
                })
			}

		}

}

1 个答案:

答案 0 :(得分:1)

了解您的代码和尝试执行的操作有些棘手。

但是请使用您的描述。->

  

函数A调用函数B。然后,在函数A调用之后,   函数B调用自身。然后,在此递归调用中,函数B   调用函数C。函数C返回一个Promise。

我创建了一个可完成上述操作的代码段,但使用了一个简单的倒数计时器。当然,这对于倒数计时器来说有点复杂,但希望是一种显示A如何调用B,B如何调用自身的方法,最终返回的是C .. :)是一口。 >

const delay =ms => new Promise((r, j)=>setTimeout(r, ms));

//Function C returns a promise.
const C = async () => {
  return "Blast off.";
}

//Function B calls itself, 
//function B calls function C
const B = async (count) => {
  console.log(count);
  await delay(500);
  if (count < 1) return C();
  return B(count - 1);
}

//function A calls Function B
const A = async (count) => {
  return B(count);
}

console.log("Start countdown");
A(10).
  then(msg => console.log(msg)).
  catch(e => console.log(e));