Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript数组在另一个函数中不工作(未报告错误)_Javascript_Firebase_Firebase Storage - Fatal编程技术网

Javascript数组在另一个函数中不工作(未报告错误)

Javascript数组在另一个函数中不工作(未报告错误),javascript,firebase,firebase-storage,Javascript,Firebase,Firebase Storage,在Firebase函数中添加项时,我的数组将无法按预期工作。 但是,它在Firebase功能之外工作 test是调用的函数,用于将示例字符串添加到myList数组中 最奇怪的是: 在浏览器DevTools中,console.logmyList.length;按预期返回8。控制台中未报告任何错误。请查看屏幕截图以便更好地理解 多谢各位 这是因为itemRef.getMetadata是异步的,并且您的console.log是在获取数据之前执行的。您可能希望使用异步函数并等待 (async ()=&g

在Firebase函数中添加项时,我的数组将无法按预期工作。 但是,它在Firebase功能之外工作

test是调用的函数,用于将示例字符串添加到myList数组中

最奇怪的是: 在浏览器DevTools中,console.logmyList.length;按预期返回8。控制台中未报告任何错误。请查看屏幕截图以便更好地理解

多谢各位

这是因为itemRef.getMetadata是异步的,并且您的console.log是在获取数据之前执行的。您可能希望使用异步函数并等待

(async ()=>{
    var myList = [];
    for(const itemRef of items){
      const data = await itemRef.getMetadata();
      test();
    }
    //log...
})();
或者,在中执行日志记录。然后回调:

itemRef.getMetadata().then(function (metadata) {
    test();
    console.log(myList.length);
})
这是因为itemRef.getMetadata是异步的,并且您的console.log是在获取数据之前执行的。您可能希望使用异步函数并等待

(async ()=>{
    var myList = [];
    for(const itemRef of items){
      const data = await itemRef.getMetadata();
      test();
    }
    //log...
})();
或者,在中执行日志记录。然后回调:

itemRef.getMetadata().then(function (metadata) {
    test();
    console.log(myList.length);
})

如果您正在使用forEach内部的承诺,请尝试以下方法:

res.items.forEach(async (itemRef, index) => {
    try {
        let metadata = await itemRef.getMetadata()
        if (metadata) {
            test();
        }
        else {
            console.log('error');
        }
    }
    catch (error) {
        console.log(error)
    }
});

如果您正在使用forEach内部的承诺,请尝试以下方法:

res.items.forEach(async (itemRef, index) => {
    try {
        let metadata = await itemRef.getMetadata()
        if (metadata) {
            test();
        }
        else {
            console.log('error');
        }
    }
    catch (error) {
        console.log(error)
    }
});

这是因为itemRef.getMetadata是异步的,并且您的console.log是在获取数据之前执行的。这是因为itemRef.getMetadata是异步的,并且您的console.log是在获取数据之前执行的。感谢您的响应。我在控制台中打印数组长度的最后一行添加了一行新代码并更新了所有截图。虽然前一行打印了8项,但它打印了2项。请再次查看屏幕截图。很抱歉给您带来不便。谢谢。请重新回答我的问题;它只是在最后一行添加了代码来显示奇怪的行为。谢谢。@ReganHung您是否在.then回调中添加了日志记录?请尝试itemRef.getMetadata.thenfunction metadata{test;console.logmyList.length}。非常感谢您的帮助。你是对的,异步导致了这个问题。我没有意识到这一点,因为屏幕截图中显示了奇怪的控制台日志行为。控制台以某种方式打印了所有8项,比我的最后一行代码快。感谢您的回复。我在最后一行添加了一行新代码,用于在控制台中打印数组长度,并更新了所有屏幕截图。虽然前一行打印了8项,但它打印了2项。请再次查看屏幕截图。很抱歉给您带来不便。谢谢。请重新回答我的问题;它只是在最后一行添加了代码来显示奇怪的行为。谢谢。@ReganHung您是否在.then回调中添加了日志记录?请尝试itemRef.getMetadata.thenfunction metadata{test;console.logmyList.length}。非常感谢您的帮助。你是对的,异步导致了这个问题。我没有意识到这一点,因为屏幕截图中显示了奇怪的控制台日志行为。控制台设法以比我的最后一行代码更快的速度打印所有8项。