refactor(jsdoc-task-runner): improve promise handling

This commit is contained in:
Jeff Williams 2019-10-12 12:37:06 -04:00
parent 931faa4228
commit f406a31ed2
2 changed files with 30 additions and 22 deletions

View File

@ -60,16 +60,19 @@ module.exports = class TaskRunner extends Emittery {
this._unsubscribers.set(task.name, u);
}
_addTaskSequenceToQueue(tasks) {
_bindTaskFunc(task) {
return _.bind(task.run, task, this.context);
}
_createTaskSequence(tasks) {
let firstTask;
let promise;
if (!tasks.length) {
return;
return null;
}
firstTask = this._nameToTask.get(tasks[0]);
// We don't want to run the first task yet, so we wrap it in another promise.
promise = new Promise((resolve, reject) => {
this._bindTaskFunc(firstTask)().then(resolve, reject);
});
@ -84,15 +87,7 @@ module.exports = class TaskRunner extends Emittery {
}
}, promise);
this._queue.add(() => promise);
}
_addTaskToQueue(task) {
this._queue.add(this._bindTaskFunc(task));
}
_bindTaskFunc(task) {
return _.bind(task.run, task, this.context);
return () => promise;
}
_init(context) {
@ -271,6 +266,8 @@ module.exports = class TaskRunner extends Emittery {
let endPromise;
let { error, parallel, sequential } = this._orderTasks();
let runningPromise;
let taskFuncs = [];
let taskSequence;
// First, fail based on the runner's state.
runningPromise = this._rejectIfRunning();
@ -286,21 +283,28 @@ module.exports = class TaskRunner extends Emittery {
this._queue.pause();
for (const taskName of parallel) {
this._addTaskToQueue(this._nameToTask.get(taskName));
taskFuncs.push(this._bindTaskFunc(this._nameToTask.get(taskName)));
}
this._addTaskSequenceToQueue(sequential);
endPromise = this._queue.onIdle().then(() => {
let p;
taskSequence = this._createTaskSequence(sequential);
if (taskSequence) {
taskFuncs.push(taskSequence);
}
endPromise = this._queue.addAll(taskFuncs).then(() => {
const err = this._error;
if (this._error) {
p = Promise.reject(this._error);
} else {
p = Promise.resolve();
}
this.end();
return p;
if (err) {
return Promise.reject(this._error);
} else {
return Promise.resolve();
}
}, e => {
this.end();
return Promise.reject(e);
});
this.emit('start');

View File

@ -35,6 +35,8 @@ module.exports = class Task extends Emittery {
return this.func(context).then(
() => {
this.emit('end', this);
return Promise.resolve();
},
error => {
this.emit('error', {
@ -42,6 +44,8 @@ module.exports = class Task extends Emittery {
error
});
this.emit('end', this);
return Promise.reject(error);
}
);
}