【问题标题】:Return Promise from a recursive call从递归调用中返回 Promise
【发布时间】:2018-08-28 19:32:53
【问题描述】:

所以,这无疑是我所描述的一个非常愚蠢的案例,但我正在使用的代码正在这样做,我现在要么重写它,要么找到一种方法来处理它。 我的问题所指的流程如下:

函数 A 调用函数 B。然后,函数 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);
                })
			}

		}

}

【问题讨论】:

  • 是的,很可能,你能发布你的代码吗?
  • 是的,给我一点时间
  • 当然可以,但请记住,函数 A 和 B 也希望成为 Promise,或者至少将 Promise 向下传递。现在使用async / await recursive Promises 与无异步递归没有什么不同,这是一件很棒的事情,而且您还可以免费获得尾递归。
  • 第一个函数没有多大意义,$.post 无法访问,你为什么要return await?只需单独返回Promise。你能把它修剪成minimal reproducible example吗? (182行有点多)
  • 我对这个问题投了反对票,因为代码格式很糟糕,浪费了读者的时间

标签: javascript recursion promise


【解决方案1】:

了解您的代码以及您尝试做的事情有点棘手。

但是使用你的描述。->

函数 A 调用函数 B。然后,在被函数 A 调用后, 函数 B 调用自身。然后,在这个递归调用中,函数 B 调用函数 C。函数 C 返回一个承诺。

我已经创建了一个可以执行上述操作的工作 sn-p,但用于一个简单的倒数计时器。当然,对于倒数计时器来说这有点复杂,但希望是一种展示 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));
  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-03
    • 2019-04-03
    • 2014-06-04
    相关资源
    最近更新 更多