2016-10-07 10 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 на связанные очереди.

Каждая очередь затем перехватывает предыдущее задание в очереди в runBeforeFunc в Task.readFile, которое выполняется перед обработкой текущего файла.

Это не похоже на работу, однако, и независимо от того, двигаться ли я runbeforeFunc до или после callback(text) заявления в функции Task.readFile, он по-прежнему выполняет работу в неправильном порядке.

Что я делаю неправильно?

ответ

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); 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^