Javascript 将承诺代码转换为异步等待和模拟测试用例?
如何将下面嵌套了promise和wait的函数转换为仅使用wait或仅使用promiseJavascript 将承诺代码转换为异步等待和模拟测试用例?,javascript,promise,async-await,Javascript,Promise,Async Await,如何将下面嵌套了promise和wait的函数转换为仅使用wait或仅使用promise const test = (url, id) => { return new Promise((_resolve, _reject) => { if (isValidUrl(url)) { let storage = new Storage(Indexdb, id); const cae = new valueExtract(url); cae.f
const test = (url, id) => {
return new Promise((_resolve, _reject) => {
if (isValidUrl(url)) {
let storage = new Storage(Indexdb, id);
const cae = new valueExtract(url);
cae.fetch()
.then(data => {
new zip(data)
.then(obj => obj.getZip())
.then(obj => obj.getList())
.then(list => {
return new Promise(async (resolve, reject) => {
try {
let sI = storage.connection;
await Promise.all(Object.keys(list).map(async (fileName, index) => {
let blob = await new FileExtractor(list[fileName]);
await sI.setItemForce(
fileName,
new StoreObject(
fileName,
'testData',
blob
).dataObject
)
}))
_resolve(sI);
} catch (err) {
_reject(err)
}
})
})
.catch(err => _reject(err))
})
.catch(err => _reject(err))
} else {
_reject('Invalid URL')
}
})
};
我无法像我尝试的那样做,但它从未解决
const test = async (url, id) => {
if (isValidUrl(url)) {
try {
let storage = new Storage(Indexdb, id);
const cae = new valueExtract(url);
const data = await cae.fetch();
return new ZIPExtractor(data)
.then(obj => obj.getZip())
.then(obj => obj.getList())
.then(list => {
return async (resolve, reject) => {
try {
let sI = storage.connection;
await Promise.all(Object.keys(list).map(async (fileName, index) => {
let blob = await new FileExtractor(list[fileName]);
await sI.setItemForce(
fileName,
new StoreObject(
fileName,
'testData',
blob
).dataObject
)
}))
} catch (err) {
throw new Error(err)
}
}
})
.catch(err => _reject(err))
} catch (e) {
throw new Error('Invalid URL')
}
}
};
另外,我们如何为这类函数编写测试用例,以便我们不需要传入实际的网络url和开玩笑的mock。它应该实现,但要使用返回的async(resolve,reject){…}
。你不应该在一开始就使用它,你可以忽略它:
const test = async (url, id) => {
if (!isValidUrl(url)) {
throw new Error('Invalid URL')
}
const storage = new Storage(Indexdb, id);
const cae = new valueExtract(url);
const data = await cae.fetch();
const obj = await new ZIPExtractor(data); // shudder. A constructor should never return a promise
const zip = await obj.getZip();
const list = await zip.getList();
const sI = storage.connection;
await Promise.all(Object.keys(list).map(async (fileName, index) => {
const blob = await new FileExtractor(list[fileName]);
const store = new StoreObject(fileName, 'testData', blob);
await sI.setItemForce(fileName, store.dataObject);
}));
return sI; // or something?
}
感谢您的快速回复,这意味着什么,//可能需要一些
等待s
,以及我们如何测试这种方法。。如果您添加这两个参数并解释一点不太擅长异步等待的逻辑,这将非常有用代码>到多行等待。`const fileList=await obj.getZip();const list=wait fileList.getFileList();`它不起作用,我想我们忘了返回的是,如果你能解释一下单元测试的话,Soalway@Bergi非常感谢。对了,我就是这个意思。我还忘记了您想要返回一些原始代码中不清楚的内容。我认为如何测试这是一个问题,但可能您会想模拟所有构造函数,例如存储,ZipExtractor
,文件提取器
等。即使不使用异步/wait,您的承诺代码也可以简单得多。这里的嵌套完全没有必要,您应该避免newpromise()