函数,该函数从Firebase存储返回下载URL
Function that returns download URL from Firebase storage
我正在编写这个函数,以便在我的angular应用程序中评估ng重复列表中的ng src。我需要使调用同步,以便每次调用函数时值都是正确的。问题是:
为什么这个代码返回一个值:
var storage = firebase.storage();
var returnVal; //causes sync issues
var getImageUrl = function (time) {
storage.ref('images/' + time + '.jpg').getDownloadURL().then(function (url) {
returnVal = url;
});
return returnVal;
};
但这不起作用:
var storage = firebase.storage();
var getImageUrl = function (time) {
var returnVal; //so that this is specific to the function
storage.ref('images/' + time + '.jpg').getDownloadURL().then(function (url) {
returnVal = url; //I simply want to return the value of 'url'
});
return returnVal;
};
有什么想法可以让getImageUrl()函数从.then返回url吗?
这是文档链接:https://firebase.google.com/docs/storage/web/download-files
最终,我将把它变成一个$scope函数,用于类似的用途:
<div ng-repeat="message in messages">
<img ng-src="{{ getImageUrl(message.time) }}">
</div>
函数的任何变体都不会返回非null
或undefined
的值。您正在执行异步调用,在继续执行下面的代码之前不会等待结果。例如:
var storage = firebase.storage();
// Execute (1)
var getImageUrl = function (time) {
// Execute (2)
var returnVal;
// Execute (3)
storage.ref('images/' + time + '.jpg').getDownloadURL().then(function (url) {
// Execute (unknown)
returnVal = url;
});
// Execute (4)
return returnVal;
};
// Execute (unknown times)
您不知道异步调用何时返回数据,但它总是在return returnVal;
之后,因此returnVal
为null。
我推荐这个:
$scope.images = [];
$scope.messages = { // whatever };
for (m in $scope.messages) {
storage.ref('images/' + time + '.jpg').getDownloadURL().then(function (url) {
// Might need $scope.$apply(function() {} ) surrounding
$scope.images.push(url);
});
}
那么在你看来:
<div ng-repeat="image in images">
<img ng-src="{{ image }}">
</div>
所有这些加载的时间取决于$scope.messages
的大小。如果有大量的数据,我建议您更改数据结构,这样您就不必多次调用数据库。
预言家的答案包含了一个很好的解释,解释了为什么当前代码不起作用,以及一个有效的解决方案。
作为替代方案,您可以简单地返回getDownloadURL()
返回的所谓promise。我还没有测试,但希望Angular能自动获得承诺。
var storage = firebase.storage();
var getImageUrl = function (time) {
return storage.ref('images/' + time + '.jpg').getDownloadURL();
};
在你的HTML中,你只需要保留:
<div ng-repeat="message in messages">
<img ng-src="{{ getImageUrl(message.time) }}">
</div>
您可以将ajax
用于firebase存储中的下载文件
const link = linkYourFirebaseImage + folderStoreImage + '2F' + fileName;
// example: const link = https://firebasestorage.googleapis.com/v0/b/myApp.appspot.com/o/myDir%2F1608378322792.PNG;
function downloadImage(fileName, defaultImage) {
if (fileName.length == 0) return defaultImage;
let imageUrl;
$.ajax({
type: "GET",
async: false,
url: link ,
success: function (response) {
imageUrl = `${link}alt=media&token=${response.downloadTokens}`;
},
});
return imageUrl;
}
如何使用
const myImage = downloadImage('myPath.png', '../default.png');
相关文章:
- ES6构造函数返回基类的实例
- 从函数返回角度承诺
- 如何从jquery函数返回变量
- 根据是否解析了 Promise 从函数返回值
- Javascript函数返回未定义
- 如果函数返回True,则显示Javascript按钮
- Google Sheet自定义函数返回0
- 从Ajax函数返回值
- 使用for循环从Javascript中的函数返回多个值
- 谷歌地图:函数返回未定义的值在console.log中运行良好
- 从函数中的函数返回数组时出错
- 如何从嵌套的API函数返回值
- 从Mongoose结果匿名函数返回父函数
- 函数返回错误'令牌{'
- Jquery函数返回订单问题
- Mocha/Chai测试链接到函数返回断言错误
- 从异步函数返回值
- 函数返回后更新变量
- 我如何才能继续'如果'语句来比较作为参数的多个函数返回值
- 将外部函数返回的id传递给内部函数