2016-02-20 4 views
1

Я создал функцию генератора, которая рекурсивно проверяет строку и возвращает обработанный вывод. Я пытаюсь сделать запрос в генераторе, используя koa-запрос, однако он возвращается неопределенным.Как получить запрос в функции рекурсивного генератора?

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(); 
} 

Возвращает обещание вместо строки при подаче запроса (fnDetails.url).

+0

Почему эта строка результата содержит код? Просто любопытно. – Bergi

+0

Это инструмент, который позволит разработчикам создавать простые инструменты через наш интерфейс. –

ответ

1

Если вы рекурсивно вызываете функцию генератора, вы должны дать все результаты от генератора. Вы можете сделать это, используя yield*. Только возврат одного .next() результата не будет.

Вы ищете

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

Конечно, вы можете легко конвертировать хвостовую рекурсию функцию в цикле.

Смежные вопросы