我是React和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;
}
我没有收到任何错误,但是返回字符串为空(除了“ Testing”前缀)。该文件夹有大约20个jpg文件,但似乎看不到它们存在。我在网上做了一些研究,但是我仍然不确定为什么我的代码无法正常工作。请帮我知道为什么这行不通吗?
谢谢
讨厌
答案 0 :(得分:0)
这不是您的框架的问题,而是异步代码的问题。
请注意,toReturn
最终会 使用该函数调用的结果进行更新。问题在于,此函数的调用者在.then
中的任何代码有机会触摸其之前,都会立即收到该数组。
即使诺言立即解决,它上面的代码也已经执行。承诺被排在队列中,其中仅在当前同步代码完成后才执行顶层项目。
getFilesList
要做的是返回一个 Promise ,呼叫者随后可以附加该 Promise 以指定其自己的行为:
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))