当前位置: 首页 > 知识库问答 >
问题:

带生成器的非递归异步实现

耿锦
2023-03-14

我在研究javascript生成器,发现这个实现使用递归函数模拟异步等待的效果。我想知道我们是否可以实现类似但非递归的东西?我思考了很长时间,但没有找到有效的解决方案。

function sum(...args) {
    let total = 0;
    return new Promise(function (resolve, reject) {
        setTimeout(function () {
            for (const arg of args) {
                if (typeof arg !== 'number') {
                    reject(`Invalid argument: ${arg}`);
                }
                total += arg;
            }
            resolve(total);
        }, 500);
    });
}

function recursiveAsync(gen, result) {
    const obj = gen.next(result);
    if (obj.done) return;
    obj.value.then(function (result) {
        recursiveAsync(gen, result);
    });
}

function async(genFn) {
    const gen = genFn();
    recursiveAsync(gen);
}

async(function* () {
    const a = yield sum(1, 3, 5);
    console.log(a);
    const b = yield sum(2, 4);
    console.log(b);
    const result = yield sum(a, b);
    console.log(result);
});

共有1个答案

祁承嗣
2023-03-14

不,你不能反复做。

请注意,递归调用实际上不是递归的,而是异步的。然后()回调再次调用函数——并且回调不是由函数直接调用的,而是由promise计划的。调用堆栈没有增长。

 类似资料:
  • 问题内容: 我天真地尝试创建一个递归生成器。没用 这是我所做的: 我所得到的只是第一项。 有没有办法使这种代码起作用?本质上是在递归方案中将命令转移到以上级别吗? 问题答案: 尝试这个: 我应该指出,由于您的功能存在错误,因此无法使用。它可能应该包含不为空的支票,如下所示:

  • 本文向大家介绍c#递归生成XML实例,包括了c#递归生成XML实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了c#递归生成XML的方法。分享给大家供大家参考。具体实现方法如下: 这里结合网上搜到的资料,写了个递归生成xml,经过调试可以使用,数据库结构如下图所示: 代码如下: 希望本文所述对大家的C#程序设计有所帮助。

  • 问题内容: 我正在尝试编写一种算法,以Java或Javascript创建合法的Sudoku板。两者都不起作用,我也不完全清楚为什么。 本质上,两个程序中的问题是x或y的增量都超过了其应有的幅度(跳过平方)。我一生无法弄清楚这是怎么发生的。如果需要,我可以提供完成JS解决方案的HTML。 我最好的猜测是它与我如何使用递归创建堆栈有关,但是据我所知,它 应该可以 工作。在我的旧代码中,有一个不正确的f

  • 问题内容: 我有一个异步函数,要连续多次调用。问题是“多个”可以是几十万或数百万… 显而易见的方法是从回调中调用相同的函数,如下所示: 当然,涉及一些逻辑来停止递归。问题是堆栈是否充满了调用,并可能在某些时候导致堆栈溢出? 问题答案: 问题是堆栈是否充满了调用,并可能在某些时候导致堆栈溢出? 否。 如果调用回调是异步传递的,则不会堆积堆栈。 在您的代码中: 这是逐步发生的事情: 首先被称为。 然后

  • 我一直在使用异步生成器,试图创建一个“promise排序”生成器,它接受一系列promise,并按照promise解析或拒绝的顺序逐个生成promise。比如: 有了这样消耗这个发电机的想法: 然而,我注意到,这将达到第二个promise,然后发电机将停止。这似乎是因为拒绝了“第二次”promise。当被拒绝时,在生成器中调用将在生成器中创建异常。 但这是我困惑的根源。我不想在这里创建异常,我只想

  • 本文向大家介绍Node.js中的异步生成器与异步迭代详解,包括了Node.js中的异步生成器与异步迭代详解的使用技巧和注意事项,需要的朋友参考一下 前言 生成器函数在 JavaScript 中的出现早于引入 async/await,这意味着在创建异步生成器(始终返回 Promise 且可以 await 的生成器)的同时,还引入了许多需要注意的事项。 今天,我们将研究异步生成器及其近亲——异步迭代。