javascript - Firebase 存储验证图像是否存在并使用新名称上传
问题描述
uploadVariationImages(file, cb) {
// nome do arquivo
const fileName = file.name;
// caminho para o storage
const path = `abc/${fileName}`;
let ref = this.afStorage.ref(path);
console.log("First metadata: ", ref.getMetadata());
ref.getMetadata().toPromise()
.then( res => {
let currentFileName = fileName.split(".")[0];
let i = 1;
let flag = true;
do {
let attempt = this.checkIfImageExists(i, currentFileName, file);
attempt.toPromise()
.then( (res) => {
console.log(res);
i++;
console.log(i);
})
.catch( (err) => {
console.log(err);
console.log(i);
flag = false;
console.log(i);
})
} while (flag === true)
})
.catch((error) => { // erro significa que nao achou metadata, ou seja, a imagem não existe.
this.task = this.afStorage.upload(path, file);
this.snapshot = this.task.snapshotChanges();
console.log("1º: ", error);
cb(error, null);
});
}
checkIfImageExists(file, cb) {
// nome do arquivo
const fileName = file.name;
// caminho para o storage
const path = `abc/${fileName}`;
let ref = this.afStorage.ref(path);
console.log("First metadata: ", ref.getMetadata());
ref.getMetadata().toPromise()
}
使用此代码,我得到了一个永远的循环,因为它永远不会进入错误(当它没有找到任何图像并且它意味着在破折号 {-} 之后使用新数字上传图像时)。我想要做的是上传一张图片,但它必须首先验证它的名称,如果它已经存在,那么它必须在它之后插入一个 -1 或者如果那个已经存在然后插入和 -2 等等。目前,当它进入第二个错误时,我没有上传任何内容,因此如果发生某些事情,我不会上传太多图像,但如果它可以工作,我将不得不在其中插入代码来执行此操作。
解决方案
你while (flag == true)
没有等待任何承诺解决,所以这将进入一个紧密的循环。
在这种情况下,递归通常是您的朋友:
function findFirstNonExistingFile(startAt, callback) {
checkIfImageExits(startAt).then(() => {
findFirstNonExistingFile(startAt+1, callback);
}).catch(() => {
callback(startAt);
})
}
由于所有调用都在 promise 结果(then
和catch
)内,因此它们总是在检查当前文件时处理。
您可以将其与以下内容一起使用:
findFirstNonExistingFile(1, (i) => {
console.log(i);
});
当然,你也可以用一个 Promise 来实现它,但流程是一样的。
推荐阅读
- c++ - C++ 20 指定初始化的遗漏字段是否保证初始化为零?
- nest - Elasticclient - 两分钟后响应时间延长
- java - 使用 Swing 调整图标大小并在按钮上显示它们
- flutter - Flutter BottomNavigationBar 带 Navigator 且无需替换(丢失状态)
- python - 为什么列表列表中的某些元素会转换为浮点数据类型,而有些则不会?
- redhat - 如何在引导决策表中添加条件状态的对象列表?
- java - 是否有支持 Java 14 的 tomee-maven-plugin 版本?
- javascript - 减少用于添加类的多个 if 语句(jQuery)
- csv - 将 CSV 附件导入 Power Automate 时出现问题
- php - 从 PHP PDO 中的 pgSQL INSERT..ON CONFLICT RETURNING 获取值