koa中生成器的问题
发布于 4 天前 作者 huangyanxiong01 165 次浏览 来自 问答

  /**
   * generate html with view name and options
   * @param {String} view
   * @param {Object} options
   * @return {String} html
   */
  function *render(view, options) {
    view += settings.viewExt;
    var viewPath = path.join(settings.root, view);
    // get from cache
    if (settings.cache && cache[viewPath]) {
      return cache[viewPath].call(options.scope, options);
    }

    var tpl = yield fs.readFile(viewPath, 'utf8');  //就好象同步执行一样
      console.info(tpl);  //为何这里直接输出就是一个模板的内容,而我按照koa做法,却做不到,
    var fn = ejs.compile(tpl, {
      filename: viewPath,
      _with: settings._with,
      compileDebug: settings.debug,
      open: settings.open,
      close: settings.close
    });
    if (settings.cache) {
      cache[viewPath] = fn;
    }

    return fn.call(options.scope, options);
  }

而我在网上找些资料看了一下,模仿写了一个却做不到

const ejs = require('koa-ejs'),
    path = require('path'),
    thunkify = require('thunkify');
    fs = require('fs'),
    consoleConfig = require('../console/config'),
    read = thunkify(fs.readFile);  // 1

    function *i8ngen(lang){
        var langPath = path.normalize(consoleConfig.savePath + lang + '.' + consoleConfig.outputFileExt);
        yield read(langPath, 'utf8');
    }

    ejs.ejs.filters.i8n = function (code, lang) {
        var i8n = i8ngen(lang);
        i8n.next().value(function (err,data) {
            console.info(data);
            i8n.next(data.toString());
        });
        console.info(i8n.next());
3 回复

不是很明白问题… 是想在 ejs.esj.filters.i18n 同步读取文件吗? 直接用 readFileSync 不行吗 ? 0.0

@elrrrrrrr 可以就是想知道用异步能不能解决

用co包一下再跑,原生的生成器手动调用next太麻烦,koa就是用co包了下,yield后边跟thunkify或者promise

回到顶部