同步检索Firebase存储网址?

问题描述:

我有这样的文件名列表对象的列表:同步检索Firebase存储网址?

Object 1 
    Files 
    file1:1234 
    file2:2345 
Object 2 
    Files 
    file1:456 
    file2:656 

我遍历每个对象,其中的每一个对象,我遍历每个文件和查询火力存储获取每个文件的网址。以便将其作为超链接显示给数据表。

var tableData = []; 
//Code to Loop over the objects 
    var myApp ={ fileurls:[]}; 
    var i =0; 
    angular.forEach(filesContainer.filenames, function(value, key) { 
      storageRef.child('/myfiles/'+ value) 
      .getDownloadURL().then(function(url) { 
       myApp.fileurls[i] = url; 
       i++; 
       } 
      }).catch(function(error) { 
       console.log("Error"); 
       }); 
    }); 
tableData.push(); 
//Loop over object ends here 
//invoke successcallbackfunction to display the tableData 
successcallbackfunction(tableData); 

与我上面的代码的问题是,由于asycnhronous火力电话,myApp阵列始终是空的。我如何才能确保tableData.push()行仅在循环完成对象的文件时才能执行?

+0

一件事,你需要通过改变VAR对myApp = {fileurls []}更新JavaScript代码; var myApp = {fileurls:[]}; ? –

+0

是粘贴错误代码 – user2713255

尝试修改此:

angular.forEach(filesContainer.filenames, function(value, key) { 
      storageRef.child('/myfiles/'+ value) 
      .getDownloadURL().then(function(url) { 
       myApp.fileurls[i] = url; 
       i++; 
       } 
      }).catch(function(error) { 
       console.log("Error"); 
       }); 

到:

angular.forEach(filesContainer.filenames, function(value, key) { 
      storageRef.child('/myfiles/'+ value) 
      .getDownloadURL().then(function(url) { 
       myApp.fileurls[i] = url; 
       i++; 
        if (i == filesContainer.filenames.length) { 
         tableData.push(); 
         //Loop over object ends here 
         //invoke successcallbackfunction to display the tableData 
         successcallbackfunction(tableData); 
        } 

       } 
      }).catch(function(error) { 
       console.log("Error"); 
       }); 

所以一旦最后一次迭代完成后,再执行所需的代码。

+0

时的错字,我需要在对象循环结束而不是文件循环后进行成功回调。我的对象循环本质上是forEach on firebase查询快照 – user2713255

+0

您的对象循环代码在哪里? –

The Reference.getDownloadUrl() function returns a Promise。因此,这意味着你可以做平时的承诺与Promise.all()收集:

var tableData = []; 
var i =0; 
var promises = []; 

angular.forEach(filesContainer.filenames, function(value, key) { 
    promises.push(
     storageRef.child('/myfiles/'+ value).getDownloadURL() 
    }); 
}); 
Promise.all(promises).then(functions(urls) { 
    var myApp ={ fileurls: urls }; 
    tableData.push(); 
    successcallbackfunction(tableData); 
}).catch(function(error) { 
    console.log("Error"); 
});