2016-10-07 6 views
0

こんにちは私は、特定の順序で読む必要があるいくつかのファイルがあります。ファイルの内容を順番に処理する

これを行うには、前のファイルのonloadend機能を起動したファイル読み取りを実装しようとしました。

マイMWEはここにある:次のテストコード付きhttps://jsfiddle.net/q3h49dL2/

class Chain { 
    // File Chain ops 
    addReadJob(job) { 
    console.log("Queuing:", job.file.name); 

    if (this.firstjob === undefined) { 
     this.firstjob = 0; 
    } 

    // Store previous job 
    var lastjob = this.firstjob; 

    // Create new job that passes the previous job 
    // as a readbeforefunc argument to new job. 
    this.firstjob = function() { 
     Task.readFile(job.file, job.task, lastjob); 
    } 
    } 

    constructor() { 
    //Let's create a bunch of jobs 
    var job1 = { 
     file: {name: "File1",text: "File1 contents"}, 
     task: Task.taskDoer1 
    }; 
    var job2 = { 
     file: {name: "File2",text: "File2 contents"}, 
     task: Task.taskDoer2 
    }; 
    var job3 = { 
     file: {name: "File3",text: "File3 contents"}, 
     task: Task.taskDoer1 
    }; 

    // Now queue them 
    this.addReadJob(job1); 
    this.addReadJob(job2); 
    this.addReadJob(job3); 

    // And process them all from the first chain 
    this.firstjob(); 
    } 
} 


class Task { 
    static taskDoer1(text) {console.log("randomtask:", text);} 
    static taskDoer2(text) {console.log("anotherrandomtask", text);} 

    // !!!HERE PROBLEMS OCCUR!!! 
    static readFile(file, callback, runbeforefunc = 0) { 
    var fr = new FileReadPretend(); 

    fr.onloadend = function(text) { 
     // Run previous job in chain first 
     if (runbeforefunc !== 0) { 
      runbeforefunc(); 
     } 
     callback(text); 
    } 
    fr.readAsText(file); 
    } 
} 


class FileReadPretend { 
    constructor(){ 
    this.onloadend = null; 
    } 
    readAsText(file) { 
    var that = this; 

    setTimeout(function() { 
     that.onloadend(file.text); 
     console.log("--read", file.name); 
    }, 1000); 
    } 
} 


new Chain(); 

一般的な考え方は、私がリンクされたキューにファイルとそのFileHandlerのタスク機能の束をキューということです。

各キューは、現在のファイルが処理される前に実行されるTask.readFilerunBeforeFuncにキュー内の以前のジョブをフックします。

Task.readFileの機能の10の前または後にrunbeforeFuncを移動したかどうかにかかわらず、まだ間違った順序でジョブが実行されます。

私は間違っていますか?

答えて

1

多分少し些細な答えかもしれませんが、なぜあなたはちょうどそのような順序を変えないのですか?

// Now queue them 
    this.addReadJob(job3); 
    this.addReadJob(job2); 
    this.addReadJob(job1); 

https://jsfiddle.net/4Lv10zk1/

+0

ハのが、ちょうど私が仕事をキュー全体スケジューラを書き換える必要があるだろうと言ってみましょう。 'Task.readFile'や'(Chain).addReadJob'を変更して現在のキューの順序を保持するだけでこれを行う方法はありますか? – tetris11

0

些細な事実上、それを解決:ええ、

addReadJob(job) { 
    console.log("Queuing:", job.file.name); 

    if (this.firstjob === undefined) { 
     this.firstjob = function(){}; // dummy func 
    } 

    // Store previous job 
    var lastjob = this.firstjob; 

    // Create new job that passes the previous job 
    this.firstjob = function() { 
     lastjob(); // <--- run lastjob first, duh! 
     Task.readFile(job.file, job.task); 
    } 
} 
関連する問題