2017-01-23 1 views
1

活字体で発電しては活字体への私の旅では、コンテキスト

  1. を非同期コードをコンパイルすることはできません、私はブロッキング呼び出しは非同期コード内で行われることはありません必要があることを助言されました。

  2. 私はジェネレータも使用しています。なぜなら、ディレクトリトラバーサルを容易にし、スタック領域が不足しないようにするからです。私は(この場合は:readdir)非同期コードを組み合わせたとき

しかし、発電機と、コンパイラは収率は唯一のコンパイラが結合することはできないと思われるために私をリードし、発電機内で使用することができることを不平を言いますクロージャ、ジェネレータ、および非同期コードを一括して処理できます。このような状況で推奨されるベストプラクティスは何でしょう

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. 

質問

私は単純にすべてを同期し、コードをブロックするが、プロミス内でコールを「ラップする」と考えても問題ないでしょうか?あなたはそのようなことを行うことができ

+0

がhttp://stackoverflow.com/questions/41326217/js-how-to-use-generator-and-を参照してください。コールバックでの返品 –

答えて

1

(コールバックの内側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 
+0

私はあなたが提案した解決策を理解しており、原則としてそれがうまくいくと思います。しかし、私は、コンパイラが関連スコープに関して制限されているという証拠を、エラーメッセージに考慮する必要があるかどうかを理解したいと思います。あるいは、コンパイラのバグと見なすことができます。私は問題を提出したいと思いますが、最初に、コンパイラが不具合または設計によって文句を言うかどうかを理解したいと思います。何か案は? –

+0

コンパイラは、 '関数'(コールバック内)の 'yield * 'のためにコンパイラーが文句を言っています。これは論理的です。なぜなら、非同期関数が呼び出されたときに、 readdirのコールバックの実行前に終了しました –

関連する問題