У меня есть этот блок кода в функции:функция Асинхронный внутри асинхронной функции
this.apiService.fetchCategories(!this.cacheData).subscribe(
response => {
if(this._jsnValService.valCategories(response)) {
this.customerMap.categories = this.formatCategories(response["categories"]);
} else {
alert("Categories failed the schema validation. Please contact support if this happens again.");
}
},
error => {
this.notification.title = "Oops, there's a problem.";
this.notification.content = "Seems there's an issue getting the provider categories.";
this.notification.show("provider_categories_api");
}
);
Он извлекает некоторые данные, а затем запускает проверку на данных (if(this._jsnValService.valCategories(response)) {
).
Однако моя проверка данных на самом деле также асинхронна, поскольку она проверяет ее на json-схему, которая находится в отдельном json-файле, поэтому она должна сначала прочитать файл.
Я использовал обещание прочитать содержимое файла, а затем выполнить проверку:
@Injectable()
export class ValidateJSONSchemaService {
constructor(private http: Http) {}
public valCategories(json) {
this._getSchema("./jsonSchema.categories.json").then((schema) => {
this._valSchema(json, schema);
});
};
private _valSchema(json, schema): any {
var ajv = new Ajv();
var valid = ajv.validate(schema, json);
if (!valid) {
console.log(ajv.errors);
return false;
} else {
console.log(valid);
return true;
};
};
private _getSchema(fileName): any {
return new Promise((resolve, reject) => {
this.http.get(fileName)
.map(this._extractData)
.catch(this._handleError)
.subscribe(schema => resolve(schema));
});
};
private _extractData(res: Response) {
let body = res.json();
return body.data || {};
};
Как я могу редактировать верхний блок кода в этом вопросе, чтобы учесть асинхронную функцию внутри, если заявление (if(this._jsnValService.valCategories(response)) {
)?
Для начала вам нужно 'valCategories', чтобы вернуть Promise или принять аргумент обратного вызова - так как это значит, у вас нет шансов изменить верхний блок для использования этой функции - кстати, какой язык является второй блок? это не javascript –
@JaromandaX Я использую машинопись. Извините за вводящий в заблуждение тег es6-prom. Я вернусь к этому вопросу завтра на работе и попробую его, с нижним блоком кода в ответе ниже. ура – BeniaminoBaggins