gpt4 book ai didi

javascript - 从 Firebase 存储返回下载 URL 的函数

转载 作者:行者123 更新时间:2023-11-30 08:30:35 24 4
gpt4 key购买 nike

我正在编写此函数以在我的 Angular 应用程序中使用以评估 ng-repeat 列表中的 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>

最佳答案

您的函数的任何变体都不会返回不是 nullundefined 的值。您正在执行一个异步调用,该调用不会等待结果,然后继续执行其下方的代码。例如:

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 的大小。如果数量很大,我建议更改您的数据结构,这样您就不必多次调用数据库。

关于javascript - 从 Firebase 存储返回下载 URL 的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38523515/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com