【问题标题】:How to yield a request within a recursive generator function?如何在递归生成器函数中产生请求?
【发布时间】:2016-06-01 19:28:29
【问题描述】:

我创建了一个生成器函数,它递归地检查字符串并返回解析后的输出。我正在尝试使用 koa-request 在生成器中发出请求,但是它返回未定义。

var parseUserExpression = function *() {
    var body = yield bodyParser.json(this);

    var fnString = body.ts;

    var res = yield parseRulesAndFunctions(fnString, null);

    this.body = res;
};

// Recursive function
var parseRulesAndFunctions = function *(aStr, start) {
    var res;
    start = start || 0;

    var fnDetails = getFnDetails(aStr, start);

    if (fnDetails.fnType === 'run') {
        var url = yield request(fnDetails.url);

        res = aStr.slice(0, fnDetails.startIndex) + 'yield request(' + fnDetails.fnName + ',' + fnDetails.fnParams + aStr.slice(fnDetails.endIndex);
    }

    // Recurse
    if (res.indexOf('call') === -1 && res.indexOf('run') === -1) {
        return res;
    }
    return parseRulesAndFunctions(res, fnDetails.paramEnd).next();
}

在产生请求时返回 Promise 而不是字符串(fnDetails.url)。

【问题讨论】:

  • 为什么结果字符串包含代码?只是好奇。
  • 这是一个允许非开发人员通过我们的 UI 创建简单工具的工具。

标签: node.js recursion yield koa


【解决方案1】:

如果您递归调用生成器函数,则必须从生成器中生成所有结果。您可以使用yield* 做到这一点。只返回一个 .next() 结果是不行的。

你在寻找

return yield* parseRulesAndFunctions(res, fnDetails.paramEnd);

当然,您可以轻松地将尾递归函数转换为循环。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-03
    • 1970-01-01
    • 2012-01-14
    • 2012-04-06
    • 2016-08-21
    • 2023-03-24
    • 2015-05-14
    相关资源
    最近更新 更多