アイドル時間における関数型プログラミングを用いた60 fps



js-coroutines JSONの構文解析やストリングス化のような標準関数を処理したり、起動されてからアイドル時にデータを圧縮することができました- 60 fpsですべてが滑らかに保たれるように、複数のフレームを使ってジョブを分割することができました.
const process =
        pipe(
            parseAsync,
            mapAsync.with((v) => ({...v, total: v.units * v.price})),
            stringifyAsync,
            compressAsync        
        )
ここではいくつかのJSONをパースし、アイテムの合計値を操作し、JSONに格納し、それを圧縮するダミールーチンです.
このパイプラインをデータで呼び出すことができます.
   const compressedData = await process(inputJSON)
The pipe 関数は標準と連動して非同期プロセスを生成するjs-coroutines , アニメーションとインタラクションのために十分な時間があることを確実として、主な糸で共同作業のすべての仕事を走らせてください.
我々はまた、分割したい独自の計算を挿入することができます
      const process = pipe(
             parseAsync,
             function * (data) {
                let i = 0
                let output = []
                for(let item of data) {
                    output.push({...item, 
                       total: item.units * item.price,
                       score: complexScore(item)
                    })
                    if((i++ % 100)==0) yield
                }
                return output
             },
             tap(console.log),
             stringifyAsync
         )         
ここでは、パイプラインにジェネレータ機能を入れて、我々が電話するのを確実にしますyield 今や何度も.このyieldコールは、次のアイドル時に関数の再開を継続するか、スケジュールを立てるのに十分な時間があることを確認します.

新機能


機能
パラメータ
目的pipe ...function 各機能は、非同期関数、通常の関数またはジェネレータ
関数はパイプラインの現在値を受け取り、それを処理します.あなたはcall() 他のパラメータを渡す関数mapAsync . JSコルーチンのすべてのXXXAsync関数は.with() 関数を使用すると、ショートカットのインポートに使用することができます-それは同じ効果があります.
パイプラインを実行するためのasync関数を作成するtap function(current){...}この関数は、現在の値を受け取るパイプラインに関数を追加しますが、結果を返しません.あなたがログまたは保存のような副作用を引き起こすために使用することができます.パイプラインが機能が完了するまで実行を停止します.branch function(current){...}この関数は、現在の値を受け取るパイプラインに関数を追加します.あなたがログまたは保存のような副作用を引き起こすために使用することができます.パイプラインは実行を中断しないので、この点から新しい継続が形成される.repeat function , times指定した関数を複数回実行する関数を作成するcall function , ...paramsこの関数は、パイプラインの現在値を取得する別の関数を呼び出すことができますが、余分なパラメータが必要です.指定されたパラメータはパイプラインの現在値に追加されます.

デモ