mirror of
https://github.com/jsdoc/jsdoc.git
synced 2025-12-08 19:46:11 +00:00
refactor(jsdoc-task-runner): improve promise handling
This commit is contained in:
parent
931faa4228
commit
f406a31ed2
@ -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');
|
||||
|
||||
@ -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);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user