如何在递归生成器函数中生成请求?
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);
当然,您可以轻松地将尾递归函数转换为循环。
我创建了一个生成器函数,它递归地检查一个字符串和 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);
当然,您可以轻松地将尾递归函数转换为循环。