2017-01-19 3 views
0

У меня есть этот блок кода в функции:функция Асинхронный внутри асинхронной функции

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)) {)?

+0

Для начала вам нужно 'valCategories', чтобы вернуть Promise или принять аргумент обратного вызова - так как это значит, у вас нет шансов изменить верхний блок для использования этой функции - кстати, какой язык является второй блок? это не javascript –

+0

@JaromandaX Я использую машинопись. Извините за вводящий в заблуждение тег es6-prom. Я вернусь к этому вопросу завтра на работе и попробую его, с нижним блоком кода в ответе ниже. ура – BeniaminoBaggins

ответ

0

если вы используете ES6 вы можете использовать асинхр/ждать, как это:

async function _validateCategories() { 
    this.apiService.fetchCategories(!this.cacheData).subscribe(
    response => { 
     const valid = await this._jsnValService.valCategories(response) 
     if(valid) { 
      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"); 
    } 
); 
} 

если нет, то ваша функция fetchCategories должны возвращать обещание или позволяют передать функцию обратного вызова, чтобы сделать что-то вроде этого:

Смежные вопросы