2017-09-27 4 views
1

私は私がこれまで見てきた何かを好きではない...大きなファイルを非同期でロードする必要があるノードモジュールには、そのパターンが有用であるという共通のパターンがありますか?

モジュール

import lineReader from 'line-reader' 

let bigFile = './huge-file.csv' 

export default class DooDad { 

    constructor() { 
     this.dictionary = new Map() 
     // Something like this seems like it'd be nice... 
     // await this.load() 
    } 

    load() { 
     return new Promise((resolve, reject) => { 
      lineReader.eachLine(bigFile, (line, last) => { 
       // this.dictionary = The contents of huge-file.csv 
      }) 
     }) 
    } 

    doStuff(foo) { 
     // Uses this.dictionary to do something interesting 
     // Problem: Unusable without first calling and waiting for this.load() 
    } 
} 

使用

import DooDad from '../doodad' 

let doodad = new DooDad() 

// We have to first call and wait for load() before doodad is useable 
doodad.load().then(x => { 
    doodad.doStuff() 
}) 

は、あなたがしたいと思うのいずれかのように思えるの...

1)ローディングを同期させる

2)スタティックにするコンストラクタは約束を返してください)あのもの

3の新しいインスタンスに解決の約束を返すあのもので関数は、(その読み込み完了時Asynchronous constructor

4)イベントを放ち)奇妙なようだ

5)残しておく方法

6)

答えて

2

doodad.load().then()は私にとって理にかなっています。コンストラクタを非同期にしたくないので、​​は非同期のものがどこにあるのが理にかなっています。

私が見たもう1つのパターンは、約束を返すファクトリタイプの関数をエクスポートし、その約束が解決されたときに解決された値は完全に形成されたオブジェクトです。これには、非同期の処理が完了するまでオブジェクトへのアクセスがないという利点があり、準備が整う前にコードを使用しようとするコードを呼び出すことによる誘惑はありません。

import makeDooDad from '../doodad' 

makeDooDad().then(doodad => { 
    // you only get access to the object here after it's been fully 
    // initialized 
    doodad.doStuff(); 
}); 

そして、makeDooDad()ファクトリ関数は、あなたのモジュールのこの内部のようなものが行われます。あなたの他のオプションについては

ロードが同期してください

これはサーバーstarでのみ行われている場合のみ可能ですtup時間。一般に、サーバーの起動時には同期I/Oを実行するのに実際のコストはかかりませんが、しばしば事態をより簡単にします。たとえば、require()自体が同期I/Oを実行します。

静的私はファクトリ関数で上記の推奨どのような本質的であるあのもの

の新しいインスタンスに解決の約束を返すあのものに関数を作成してください。これはしばしば良いオプションです。

号が本当にそれをしたくないコンストラクタが

の約束(奇妙なようです)非同期コンストラクタを返してください。コンストラクターは、約束ではなくオブジェクトを返すべきです。約束を返すには、ファクトリ関数を使用します。ストリームが実際に開いているときには行わ

ようwriteStreamの作成など、これを行うコードの他の部分があるのロード時

イベントを放ち、ストリーム上openイベントを発します。しかし、約束の日には、これは、まだ多くのイベントを使用していない他のタイプのオブジェクトのためのものを行う私の好きな方法ではありません。

があるとしてそれはOKですが、私は約束を返すファクトリ関数を好むことが

でどのようにそれを残します。

+0

良い点。私は同期が好きで、それが意味をなさないとき、私は工場に「これはオブジェクトへのアクセスがないという利点があります」に基づいて販売されています。 – Jason

+0

@Jason - これがあなたの質問に答えるならば、回答の左側にあるチェックマークをクリックすることでそれをコミュニティに示すことができます。また、スタックオーバーフローに関する正しい手順に従うための評判ポイントを得ることができます。 – jfriend00

関連する問題