【发布时间】:2020-11-03 18:51:24
【问题描述】:
我正在使用 FileSystem API 生成一个目录,其中包含 2 个条目,我需要将其用作要运行的测试的输入。问题是 Jasmine 在运行测试之前没有等待承诺解决,所以它失败了。我使用了异步包装器,但它似乎没有什么不同。
有人知道为什么会失败吗?
describe('traverseDirectory() method', () => {
let directoryToTraverse;
let entries;
beforeEach(async(() => {
console.log('beforeEach test');
const file1 = createBlob(['<a id="a"><b id="b">Hello A</b></a>'], {type: 'text/html'});
const file2 = createBlob(['<a id="b"><b id="b">Hello B</b></a>'], {type: 'text/html'});
function createFile(fs: any, fileName: string, blob: Blob): Promise<any> {
return new Promise((resolve, reject) => {
fs.root.getFile(fileName, {create: true}, (fileEntry) => {
fileEntry.createWriter((fileWriter) => {
fileWriter.onwriteend = (e) => {
resolve(fileEntry);
// @ts-ignore
};
fileWriter.write(blob);
});
});
});
}
function moveToDirectory(directoryEntry: any, fileEntry: any): void {
fileEntry.moveTo(directoryEntry);
}
function createDirectory(fs: any, name: string): Promise<any> {
return new Promise((resolve, reject) => {
fs.root.getDirectory(name, {create: true}, (directoryEntry) => {
resolve(directoryEntry);
}, errorHandler);
});
}
function errorHandler(err: any): void {
console.log('ERROR:', err);
}
const promise = new Promise((resolve, reject) => {
function onInitFs(fs: any): void {
createDirectory(fs, 'Documents').then((directoryEntry) => {
const f1 = createFile(fs, 'File1.html', file1);
const f2 = createFile(fs, 'File2.html', file2);
Promise.all([f1, f2]).then((createdEntries) => {
createdEntries.forEach((entry) => {
moveToDirectory(directoryEntry, entry);
});
directoryToTraverse = directoryEntry;
console.log('Finished setup');
resolve();
});
});
}
// @ts-ignore
window.webkitRequestFileSystem(window.TEMPORARY, 1024 * 1024, onInitFs, errorHandler);
});
})
);
it('should run', async(() => {
console.log('Running the test');
service.traverseDirectory(directoryToTraverse).then(res => {
entries = res;
});
expect(directoryToTraverse).toEqual(entries);
}));
});
【问题讨论】:
-
也许我不明白异步函数的使用呢?我认为它迫使承诺在一种等待承诺完成的沙盒环境中运行
-
顺便说一句,您应该始终调用
reject,而不是调用errorHandler。 -
我相信你从这里开始考虑 async/await:javascript.info/async-await 而我正在使用来自 angular/core/testing 的异步:angular.io/api/core/testing/async
-
哦。正确的。我错过了额外的括号。
-
“为什么 Jasmine 不等我完成承诺?” - 因为她受够了你和你的承诺,然后和阿拉丁跑了。
标签: angular typescript promise jasmine