gpt4 book ai didi

javascript - Promise.reject in .then() 返回未定义

转载 作者:行者123 更新时间:2023-11-29 20:40:02 25 4
gpt4 key购买 nike

我目前有一个带有构造函数和两个方法的 ES6 类。我有点困惑为什么在 .then() 中使用 Promise.reject(ex) 会解析未定义。如果有人不介意解释我做错了什么,将不胜感激。

我有一个名为 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 解析错误是否被捕获,然后一个 promise 被拒绝,看起来像这样:

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 构造函数反模式的示例.理想情况下,我想拒绝这个,而不是直接返回错误,因为那样我就可以断言该方法被拒绝并且没有实现。

最佳答案

您在 catch 子句中“吞下”了 getCompDoc 中的错误。具体来说,这是代表您的代码的简化片段:

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 解析为 undefined。如果您想传播错误,您的 catch 子句将不得不抛出一个新错误或返回一个被拒绝的 promise :

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));

关于javascript - Promise.reject in .then() 返回未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55813611/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com