如何在递归生成器函数中生成请求?

How to yield a request within a recursive generator function?

我创建了一个生成器函数,它递归地检查一个字符串和 returns 一个已解析的输出。我正在尝试使用 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();
}

Returns 生成请求时使用 Promise 而不是字符串 (fnDetails.url)。

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

您正在寻找

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

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