refactor: simplify compileAsync, #249

master
Evgeny Poberezkin 2016-10-20 21:12:34 +01:00
parent 3fab5c7019
commit 48cee59cb8
1 changed files with 15 additions and 30 deletions

View File

@ -17,22 +17,13 @@ function compileAsync(schema, callback) {
/* jshint validthis: true */ /* jshint validthis: true */
var schemaObj; var schemaObj;
var self = this; var self = this;
var p; if (typeof this._opts.loadSchema != 'function')
try { throw new Error('options.loadSchema should be a function');
schemaObj = this._addSchema(schema);
} catch(e) {
p = Promise.reject(e);
}
if (!p) { var p = Promise.resolve().then(function () {
if (schemaObj.validate) { schemaObj = self._addSchema(schema);
p = Promise.resolve(schemaObj.validate); return schemaObj.validate || _compileAsync(schemaObj);
} else { });
if (typeof this._opts.loadSchema != 'function')
throw new Error('options.loadSchema should be a function');
p = _compileAsync(schemaObj);
}
}
if (callback) { if (callback) {
p.then( p.then(
@ -45,20 +36,16 @@ function compileAsync(schema, callback) {
function _compileAsync(schemaObj) { function _compileAsync(schemaObj) {
var validate; try { return self._compile(schemaObj); }
try { validate = self._compile(schemaObj); }
catch(e) { catch(e) {
return e.missingSchema if (!e.missingSchema) throw e;
? loadMissingSchema(e) return loadMissingSchema(e);
: Promise.reject(e);
} }
return Promise.resolve(validate);
function loadMissingSchema(e) { function loadMissingSchema(e) {
var ref = e.missingSchema; var ref = e.missingSchema;
if (self._refs[ref] || self._schemas[ref]) if (added(ref)) throw new Error('Schema ' + ref + ' is loaded but ' + e.missingRef + ' cannot be resolved');
return Promise.reject(new Error('Schema ' + ref + ' is loaded but ' + e.missingRef + ' cannot be resolved'));
var schemaPromise = self._loadingSchemas[ref]; var schemaPromise = self._loadingSchemas[ref];
if (!schemaPromise) { if (!schemaPromise) {
@ -67,19 +54,17 @@ function compileAsync(schema, callback) {
} }
return schemaPromise.then(function (sch) { return schemaPromise.then(function (sch) {
if (!(self._refs[ref] || self._schemas[ref])) { if (!added(ref)) self.addSchema(sch, ref);
try {
self.addSchema(sch, ref);
} catch(e) {
return Promise.reject(e);
}
}
return _compileAsync(schemaObj); return _compileAsync(schemaObj);
}); });
function removePromise() { function removePromise() {
delete self._loadingSchemas[ref]; delete self._loadingSchemas[ref];
} }
function added(ref) {
return self._refs[ref] || self._schemas[ref];
}
} }
} }
} }