我基本上是尝试根据存储在数组中的值删除存储和数据库中的特定Firebase数据。我有一个对象数组,这些对象包含一个密钥(这是一个用于FirebaseStorage和FirebaseDatabase的子密钥,一个图片名称和一个文件目的地。为了确保我不只是删除对图片的引用,我也想要在Firebase存储中删除它。因此,我认为使用for循环可以解决问题。这是我的代码到目前为止:
var key, count = 0;
for (key in delArray) {
if (delArray.hasOwnProperty(key)) {
count++;
}
}
for (index = 0; index < count && canProceed; index++) {
canProceed = false;
var deletionFileLocation = storageNews.child(newsId + "/" + delArray[index].key + "/" + delArray[index].name);
deletionFileLocation.delete().then(() => {
databaseNews.child(newsId).child('thumbnails').child(delArray[index].key).remove().then(() => {
canProceed = true;
});
});
if (index == delArray.length) {
console.log('done');
}
}
这段代码的奇怪之处在于,它删除了所有(我认为,据我所知)图片,但仅在数据库中引用。换句话说,它只删除数据库中的一个子节点。我在这做错了什么?我是否需要使用异步等待回调?如果是这样,我将如何处理它?我对React很新,我似乎无法理解我会怎么做。
答案 0 :(得分:1)
看起来你安排它以便for循环挂起进程,直到任何一个remove()
promises结算。缺少的概念是Promise.all()
。
// moved to a promise-returning function so we can see what's going on
function deleteDataAndStorage(newsId, obj) {
let path = newsId + "/" + obj.key + "/" + obj.name;
let deletionFileLocation = storageNews.child(path);
return deletionFileLocation.delete().then(() => {
return databaseNews.child(newsId).child('thumbnails').child(obj.key).remove();
});
}
现在循环简单明了。 Promise.all()
执行名称所说的内容:当您传递的所有承诺都已解决时,它会以一系列结果解析。
let promises = [];
for (index = 0; index < count; index++) {
promises.push(deleteDataAndStorage(newsId, delArray[index]));
}
return Promise.all(promises).then(result => {
console.log('done');
});