【发布时间】:2020-02-13 22:42:39
【问题描述】:
我正在使用 react-native firebase 将我的媒体保存到 firebase。我有一组需要保存在 Firebase 中的 URL。为此,我使用 map() 来一一保存。保存后,我将成功 URL 推送到数组。 我需要用这个数组作为参数调用一个函数。所以我需要在数组完成后调用这个函数。 我搜索了很多,但我没有找到这个任务的一个很好的解释。谁能帮我。谢谢。
var mediaArray = []; //array of success callbacks values
var completedMediaSurveysAnswers = [{}, {}, {}]; //object array of URLs and media types
completedMediaSurveysAnswers.map((i) => {
try {
const storage = firebase.storage();
const mRef = storage.ref('portal').child('Survey/Image/user/' + uuidv4() + 'media');
mRef.putFile(i.urlPath, {
contentType: i.mediaType
})
.on('state_changed', snapshot => {},
err => {
console.log('Failed to upload file to firebase storage')
},
uploadedFile => {
// Success
this.setState({
mediaPath: uploadedFile.downloadURL
})
mediaArray.push(this.state.mediaPath)
});
} catch (error) {
console.log(error)
}
})
//need to call this function after loop is done
saveAnswers(mediaArray)
【问题讨论】:
-
不要使用
.map进行简单的迭代。为此使用.forEach。映射是将每个条目转换为另一个条目的过程,因此您将获得一个数组的 1:1 副本,其中所有项都由映射操作转换。 -
如上...除非执行 .map 的目的是返回一个 Promise 数组,您可以等待
-
虽然@VLAZ 的评论是正确的,但如果使用得当,
.map()将是一个有效的选项。因此,与其手动将元素推入mediaArray,不如将其推入mediaArray = completedMediaSurveysAnswers.map(...)(加上回调中的一些调整)。但这在这种情况下无济于事-> How do I return the response from an asynchronous call? -
@VLAZ 谢谢。我将使用 forEach。但我对在这种情况下如何使用等待/异步或承诺感到困惑:(
-
好吧,第一步,你需要一些 Promise 来等待……你的代码中有没有?不,你没有 - 所以,你需要做一些:D
标签: javascript arrays loops react-native react-native-firebase