2016-02-20 87 views
1

我已經創建了一個生成器函數遞歸檢查一個字符串並返回一個解析的輸出。我正在嘗試使用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(); 
} 

當產生請求(fnDetails.url)時返回Promise而不是字符串。

+0

爲什麼包含代碼的結果字符串?只是好奇。 – Bergi

+0

這是一個允許非開發人員通過我們的用戶界面創建簡單工具的工具。 –

回答

1

如果您遞歸調用生成器函數,則必須生成生成器的所有結果。您可以使用yield*來做到這一點。只返回一個.next()結果不會。

您正在尋找

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

當然,你可以輕鬆地轉換尾遞歸函數成一個圈。