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

时间:2016-02-20 03:01:18

标签: node.js recursion yield koa

我创建了一个生成器函数,以递归方式检查字符串并返回解析后的输出。我试图使用koa-request在生成器中发出请求,但是它返回undefined。

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)。

1 个答案:

答案 0 :(得分:1)

如果递归调用生成器函数,则必须从生成器中生成所有结果。您可以使用yield*执行此操作。只返回一个.next()结果将无法执行此操作。

您正在寻找

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

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