我目前有一个带有构造函数和两个方法的ES6类。对于在Promise.reject(ex)
中使用.then()
解析未定义的原因,我有点困惑。如果有人不介意解释我在做什么错,那将不胜感激。
我有一个名为getYaml()
的方法,其中包含以下内容:
_getYaml(recordId) {
return new Promise((resolve, reject) => {
fs.readFile(this.workingDir + '/' + recordId + '.yaml', 'utf8', function(err, data) {
if (err) reject(err)
resolve(data)
})
})
}
然后我有了另一种称为getCompDoc
的方法,该方法利用了另一种方法,如下所示:
getCompDoc(recordId) {
return this._getYaml(recordId).then(data => {
let yaml = data
let yamlObj
try {
yamlObj = YAML.safeLoad(yaml)
} catch (ex) {
ex.message = `Failure to parse yaml. Error: ${ex.message}`
logger.error(ex.message, {}, ex)
return Promise.reject(ex)
}
let compDoc = {
// ...
}
return compDoc
}).catch(err => {
logger.error(err, {}, err)
})
}
然后我要进行测试以检查是否捕获到YAML解析错误,然后拒绝承诺,如下所示:
describe('error cases', () => {
const fakeRecordId = 'SomeYaml'
beforeEach(() => {
sinon.stub(myClass, '_getYaml').returns(Promise.resolve('{{&^%}egrinv&alidgj%^%^&$£@£@£}'))
})
afterEach(() => {
myClass._getYaml.restore()
})
it('Error parsing yaml, rejects with error', () => {
return expect(myClass.getCompDoc(fakeRecordId)).to.be.rejected.then(response => {
expect(response.message).to.match(/Failure to parse yaml. Error: /)
})
})
})
测试输出:
AssertionError: expected promise to be rejected but it was fulfilled with undefined
如果我只返回在getCompDoc
方法中引发的异常,我将收到预期的错误,但是,一旦我使用Promise.reject
,它就会以未定义的方式解决。
我当时正在考虑将getCompDoc
包装在return new Promise()
中,但是我不确定这是否是Promise构造函数反模式的示例。理想情况下,我想拒绝此方法,而不是直接返回错误,因为这样我可以断言该方法已被拒绝并且未实现。
答案 0 :(得分:2)
您可以吞并getCompDoc
子句中catch
中的错误。具体来说,以下是代表您的代码的简化代码段:
let getYamlPromise = Promise.reject('REJECTED!');
let getCompDocPromise = getYamlPromise
.then(data => console.log('getYamlPromise', data))
.catch(error => console.error('getYamlPromise', error));
getCompDocPromise
.then(a => console.log('getCompDocPromise RESOLVED', a))
.catch(a => console.log('getCompDocPromise REJECTED', a));
如您所见,getCompDocPromise
的解析方式不确定。如果您想传播错误,则您的catch
子句将引发新错误或返回被拒绝的诺言:
let getYamlPromise = Promise.reject('REJECTED!');
let getCompDocPromise = getYamlPromise
.then(data => console.log('getYamlPromise', data))
.catch(error => {
console.error('getYamlPromise', error);
return Promise.reject(error);
});
getCompDocPromise
.then(a => console.log('getCompDocPromise RESOLVED', a))
.catch(a => console.log('getCompDocPromise REJECTED', a));