我是反应和firebase的新手。我试图从firebase存储桶中的一个特定文件夹中获取一串文件名(目前只是作为一个连续的字符串)。我的代码如下。
getFilesList(){
var toReturn="";
toReturn+="Testing";
var storage = firebase.app().storage(".....");
var storageRef = storage.ref();
var listRef = storageRef.child("/slides/1HdDPbTarLBxzllDlA3H/Lecture1/");
listRef.listAll().then(function(result) {
result.items.forEach(function(imageRef) {
toReturn+=this.getImageString(imageRef);
});
}).catch(function(error) {
toReturn+="error1";
});
return toReturn;
}
getImageString(imageRef) {
var toReturn="T1";
imageRef.getDownloadURL().then(function(url) {
var toReturn=url.toString();
}).catch(function(error) {
toReturn+="error2";
});
return toReturn;
}
我没有得到任何错误,但返回的字符串是空白的(除了 "测试 "前缀)。该文件夹有大约20个jpg文件,但它似乎没有看到它们在那里。我在网上做了一些研究,但我还是不知道为什么我的代码不能用。请帮我了解一下为什么不能用?
谢谢你的帮助。
贾里德
这不是你的框架的问题,而是异步代码的问题。
请看 toReturn
会 最终 更新该函数调用的结果。问题是,这个函数的调用者立即接收到了数组,而不是在 .then
有机会接触它。
即使承诺瞬间解析,它上面的代码也会已经执行。承诺会被放在一个队列中,只有在当前同步代码完成后,上面的项目才会执行。
什么是 getFilesList
需要做的是返回一个 承诺 然后,调用者可以附加到它上面,以指定自己的行为。
getFilesList(){
var toReturn="";
toReturn+="Testing";
var storage = firebase.app().storage(".....");
var storageRef = storage.ref();
var listRef = storageRef.child("/slides/1HdDPbTarLBxzllDlA3H/Lecture1/");
listRef.listAll().then(function(result) {
result.items.forEach(function(imageRef) {
toReturn+=this.getImageString(imageRef);
});
return toReturn;
}).catch(function(error) {
toReturn+="error1";
return toReturn;
});
而在调用者中,
getFilesList.then(filesList => console.log(filesList))