无法删除React Firebase Promises中的多个图像

时间:2018-02-24 20:15:27

标签: reactjs for-loop firebase-realtime-database promise firebase-storage

我基本上是尝试根据存储在数组中的值删除存储和数据库中的特定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很新,我似乎无法理解我会怎么做。

1 个答案:

答案 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');
});