代码之家  ›  专栏  ›  技术社区  ›  askaale

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

  •  1
  • askaale  · 技术社区  · 7 年前

    我基本上是根据存储在数组中的值来删除存储和数据库中的特定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');
        }
    
    }
    

    这段代码的奇怪之处在于,它删除了所有(我想,据我所知)图片,但只删除了数据库中的引用。换句话说,它只删除DB中的一个子级。我做错了什么?我是否需要对async Wait使用回调?如果是,我将如何处理?我还没有反应过来,我似乎不明白我会怎么做。

    1 回复  |  直到 7 年前
        1
  •  1
  •   danh    7 年前

    看起来您已经对其进行了安排,以便for循环将进程挂起,直到 remove() 承诺会解决。缺少的概念是 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();
        });
    }
    

    现在,循环变得简单明了。 许诺全部() 按照名称所说的做:当您传递给它的所有承诺都已解决时,它将解决一系列结果。

    let promises = [];
    for (index = 0; index < count; index++) {
        promises.push(deleteDataAndStorage(newsId, delArray[index]));
    }
    return Promise.all(promises).then(result => {
        console.log('done');
    });