如何从异步类函数JavaScript返回承诺
我正在尝试对我使用承诺重新编写的代码进行单元测试。 FileFactory类具有以下异步函数:如何从异步类函数JavaScript返回承诺,javascript,asynchronous,async-await,promise,es6-promise,Javascript,Asynchronous,Async Await,Promise,Es6 Promise,我正在尝试对我使用承诺重新编写的代码进行单元测试。 FileFactory类具有以下异步函数: async getFileHandler(filePath) { var self = this; for(const item of self.privateFileHandlers) { await item.canHandle(filePath) .then(function(response) { console.
async getFileHandler(filePath) {
var self = this;
for(const item of self.privateFileHandlers) {
await item.canHandle(filePath)
.then(function(response) {
console.log("Response:",JSON.stringify(response)); //line A
return response;
}, function(error) {
return error;
//ignore since most handlers won't be able to handle.
//also, the callback after the loop will inform that no filehandler was found.
})
.catch(function(err){
//console.log('Catching: ',JSON.stringify(err));
return err;
//ignore since most handlers won't be able to handle.
//also, the callback after the loop will inform that no filehandler was found.
});
}
}
我在A行记录的响应包含我所期望的内容
然而,在我的单元测试中,我没有得到响应对象
it('should return correct FileHandler child instance', function(){
var ff = new FileFactory();
ff.getFileHandler("./tests/H1_20180528.csv").then(function(value) {console.log("Success",JSON.stringify(value));}).catch(function(err) {console.log("Fail",JSON.stringify(err));});
//ff.getFileHandler("./tests/H1_20180528.csv").then(value => console.log("Success",JSON.stringify(value)));
//console.log(JSON.stringify(fh));
});
我错过了什么?
多谢各位
这项工作:
async getFileHandler(filePath) {
var self = this;
for(const item of self.privateFileHandlers) {
try {
let response = await item.canHandle(filePath);
if(response.status === "success")
return response;
} catch(e) {
//ignore so it does not return on failed canHandle calls.
}
}
throw 'No supporting file handler available.';
}
//更新的单元测试
describe('Select handler', function () {
it('should fail and return no file handler.', function () {
var ff = new FileFactory();
ff.getFileHandler("./tests/H1_20180528_fail2.csv")
.then(function (value) {
chai.assert(value.status === null);
})
.catch(function (err) {
chai.assert(err !== null);
});
});
it('should return correct FileHandler child instance', function () {
var ff = new FileFactory();
ff.getFileHandler("./tests/H1_20180528.csv")
.then(function (value) {
chai.assert(value.status === 'success');
})
.catch(function (err) {
chai.assert(err === null);
});
});
});
将函数的内部主体更改为:
try {
let response = await item.canHandle(filePath);
console.log("Response:", JSON.stringify(response)); // line A
return response;
} catch (err) {
return err;
}
如果您在
等待异步函数中的函数,则不必使用然后或捕获异步和等待的全部要点是,它们允许您避免明确的承诺冲突。await fn()
之后的代码被隐式处理,就好像它在.then()
回调中一样。您在测试中期望的值是多少?你的getFileHandler
没有返回任何东西。你为什么要复制错误处理代码?我来自OOP,这是我第一次在JS中处理承诺。承诺的结构提供了拒绝和捕获,所以我将两者都填满。结果证明这里不需要这些。但是从循环中返回是没有意义的,不是吗?这是有意义的。从循环中返回只是从循环中中断。如果他想迭代他的文件处理程序,默默地忽略所有出错的处理程序,然后返回第一个成功的处理程序,那该怎么办?这是我的意图。@kfedorov91是的,这可能是OP的意图,但不幸的是,问题中没有说明。