无法在Typescript中使用生成器编译异步代码

时间:2017-01-23 16:01:18

标签: node.js asynchronous typescript generator

上下文

  1. 在访问Typescript时,我被告知阻止调用永远不应该在异步代码中完成。

  2. 我也使用生成器,因为它们可以轻松进行目录遍历,避免耗尽堆栈空间。

  3. 但是,当我将异步代码(在本例中为readdir)与生成器结合使用时,编译器会抱怨 yield只能在生成器中使用,这让我认为编译器所有这一切都无法将闭包,生成器和异步代码组合在一起。

    function *yyyymmGenerator(dir: string, props: Props) {
        const fs    = require("fs");
        const yyyy  = props.range.getUTCFullYear().toString();
        const mm    = props.range.getUTCMonth().toString();
        const start = `${yyyy}-${mm}`;
    
        const files = fs.readdir(dir, function(err, files) {
            for (let i = 0; i < files.length; i++) {
                const file: string = files[i];
                if (file.localeCompare(start) >= 0) {
                    const d = `${dir}/${file}`;
                    yield file;
                }
            }
        });
    }
    
    error TS1163: A 'yield' expression is only allowed in a generator body.
    

    问题

    在这种情况下,推荐的最佳做法是什么?

    如果我只是考虑所有内容同步,阻止代码但是&#34; wrap&#34;是否可以。承诺里面的电话?

1 个答案:

答案 0 :(得分:2)

你可以这样做(在回调中调用next函数):

const gen = yyyymmGenerator(args);

function callback(err, files) {
   if(err) return gen.throw(err);
   gen.next(files);
   // Print all files returned by the generator
   for(file of gen) {
     console.log(file);
   }
}

function *yyyymmGenerator(dir: string, props: Props) {
   const fs    = require("fs");
   const yyyy  = props.range.getUTCFullYear().toString();
   const mm    = props.range.getUTCMonth().toString();
   const start = `${yyyy}-${mm}`;

   const files = yield fs.readdir(dir, callback);

   for (let i = 0; i < files.length; i++) {
      const file: string = files[i];
      if (file.localeCompare(start) >= 0) {
         const d = `${dir}/${file}`;
         yield file;
      }
   }
}

gen.next(); // Start generator