JSZip VUE 如何解析承诺数组并保存到局部变量
JSZip VUE how to resolve a promise array and save to local variable
没有使用过异步函数所以我有点迷路了...
我想要完成的是使用 JSZip 遍历 zip 文件中的文件夹中的文件,将这些文件保存在一个数组中,然后对它们进行排序,将它们保存到一个局部变量中,以便我可以进一步发送它们。
这是我的代码,我在其中获得了一系列承诺:
async extractTests(file){
let Zip = new JSZip();
let tests = await Zip.loadAsync(file).then((zip) => {
const promises = [];
zip.folder("tests").forEach(async function (relativePath, file) {
promises.push({ name: relativePath, data: await zip.file("tests/" + relativePath).async("text") });
});
return promises;
})
return tests;
}
然后我尝试在添加 zip 文件时运行的事件函数中对数组进行排序:
extract(event) {
const file = event.target.files[0];
let res = this.extractTests(file);
res.then(function (r) {
res.sort(function (a, b) {
var nameA = a.name.toUpperCase();
var nameB = b.name.toUpperCase();
console.log(a.name);
if (nameA < nameB) {
return -1;
}
else {
return 1;
}
});
})
}
列表需要排序,因为它以错误的顺序解析 - 据我所知,排序函数甚至没有触发 - 很确定它与异步函数有关。
排序适用于局部变量,将数组保存为局部变量对我来说会简单得多 - 那么我该怎么做并解决承诺。
提前致谢
强烈建议不要在高阶函数上使用 async
/ await
,这可能会导致不可预测的行为,您的代码可能看起来可以工作,但实际上只会触发一些异步调用而没有提供所需的输出。
如果没有相同库的存档结构,我无法肯定地重现该问题,但您可以尝试如下更改提取功能:
async function extractTests(file: any) {
let Zip = new JSZip();
let tests = await Zip.loadAsync(file)
.then((zip) => {
const promises = [];
zip.folder("tests")
.forEach(function (relativePath, file) { // removed async function
promises.push(
zip.file("tests/" + relativePath)
.async("text")
.then((data) => { // replaced with Promise fulfillment data update
return { name: relativePath, data: data }
})
);
});
return promises;
})
return Promise.all(tests); // Resolve all promises in parallel
}
没有使用过异步函数所以我有点迷路了... 我想要完成的是使用 JSZip 遍历 zip 文件中的文件夹中的文件,将这些文件保存在一个数组中,然后对它们进行排序,将它们保存到一个局部变量中,以便我可以进一步发送它们。
这是我的代码,我在其中获得了一系列承诺:
async extractTests(file){
let Zip = new JSZip();
let tests = await Zip.loadAsync(file).then((zip) => {
const promises = [];
zip.folder("tests").forEach(async function (relativePath, file) {
promises.push({ name: relativePath, data: await zip.file("tests/" + relativePath).async("text") });
});
return promises;
})
return tests;
}
然后我尝试在添加 zip 文件时运行的事件函数中对数组进行排序:
extract(event) {
const file = event.target.files[0];
let res = this.extractTests(file);
res.then(function (r) {
res.sort(function (a, b) {
var nameA = a.name.toUpperCase();
var nameB = b.name.toUpperCase();
console.log(a.name);
if (nameA < nameB) {
return -1;
}
else {
return 1;
}
});
})
}
列表需要排序,因为它以错误的顺序解析 - 据我所知,排序函数甚至没有触发 - 很确定它与异步函数有关。 排序适用于局部变量,将数组保存为局部变量对我来说会简单得多 - 那么我该怎么做并解决承诺。
提前致谢
强烈建议不要在高阶函数上使用 async
/ await
,这可能会导致不可预测的行为,您的代码可能看起来可以工作,但实际上只会触发一些异步调用而没有提供所需的输出。
如果没有相同库的存档结构,我无法肯定地重现该问题,但您可以尝试如下更改提取功能:
async function extractTests(file: any) {
let Zip = new JSZip();
let tests = await Zip.loadAsync(file)
.then((zip) => {
const promises = [];
zip.folder("tests")
.forEach(function (relativePath, file) { // removed async function
promises.push(
zip.file("tests/" + relativePath)
.async("text")
.then((data) => { // replaced with Promise fulfillment data update
return { name: relativePath, data: data }
})
);
});
return promises;
})
return Promise.all(tests); // Resolve all promises in parallel
}