Привет, У меня есть несколько файлов, которые нужно читать в определенном порядке.Содержимое файла процесса последовательно
Для этого я попытался реализовать чтение файлов, которое порождено функцией 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
, он по-прежнему выполняет работу в неправильном порядке.
Что я делаю неправильно?
Ха, да, но давайте просто скажем, я должен был бы переписать весь планировщик, который будет поставлен в очередь заданий. Есть ли способ сделать это, просто изменив «Task.readFile» или «(Chain) .addReadJob' и сохранив текущий порядок очередей? – tetris11