refactor: simplify compileAsync, #249
parent
3fab5c7019
commit
48cee59cb8
|
@ -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];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue