簡體   English   中英

將承諾鏈分解為單獨的功能

[英]Break promise chain into seperate functions

分為兩個功能:

public valJson(json, schemaFile: string) {
    return new Promise((resolve, reject) => {
        this.http.get(schemaFile)
            .toPromise()
            .then(fileContents => fileContents.json())
            .then((schema) => {
                let ajv = new Ajv({allErrors: true});
                ajv.validate(schema, json) ? 
                resolve() :
                reject(new Error("JSON does not conform to schema: " + ajv.errorsText()));
            }, err => reject(
                new Error("Unable to get schema file contents:" + err))
            );
    });
};

這個函數確實做了三件事,所以單元測試不是很好。

  1. 獲取文件內容
  2. 將它們解析為 json
  3. 驗證json

如何將其分解以使每個任務都可進行單元測試?

嘗試 1 打破實際的驗證部分並不順利:

public valJson(json, schemaFile: string) {
    return new Promise((resolve, reject) => {
        this.http.get(schemaFile)
            .toPromise()
            .then(fileContents => fileContents.json())
            .then((schema) => {
                this.valJ(schema)
            }, err => reject(
                new Error("Unable to get schema file contents:" + err))
            );
    });
};

    valJ(schema, json) {
        let ajv = new Ajv({ allErrors: true });
        if ajv.validate(schema, json) 
            return resolve()
        reject(new Error("JSON does not conform to schema: " + ajv.errorsText()));
    }
}

更新 - 根據反饋,我試圖停止使用匿名函數,然后我將嘗試不創建新的承諾。 我在這:

public valJson(json, schemaFile: string) {
    return new Promise((resolve, reject) => {
    var getFilePromise = this.http.get(schemaFile)
            .toPromise();
    var parseToJsonPromise = getFilePromise
            .then(contents => this.toJson(contents));
    var validateJsonPromise = parseToJsonPromise.then(schema => this.valJ(schema, json, resolve, reject),
            err => reject(
                new Error("Unable to get schema file contents:" + err))
            );
    });
};

toJson(fileContents): any {
    return fileContents.json()
}

valJ(schema, json, resolve, reject): any {
    let ajv = new Ajv({ allErrors: true });
    ajv.validate(schema, json) ?
        resolve() :
        reject(new Error("JSON does not conform to schema: " + ajv.errorsText())
    );
}

一種可能的方法:

public valJson(json, schemaFile: string) {
  return this.fetchSchema(schemaFile)
    .then(res => this.parseSchema(res))
    .then(schema => this.validateWithSchema(json, schema));
}

fetchSchema(url) {
  return this.http.get(url).toPromise();
}

parseSchema(response) {
  return response.json();
}

validateWithSchema(json, schema) {
  let ajv = new Ajv({allErrors: true});
  if (!ajv.validate(schema, json)) {
    throw new Error("JSON does not conform to schema: " + ajv.errorsText())
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM