使用gcs API时,JS增量未在for循环中更新

Posted

技术标签:

【中文标题】使用gcs API时,JS增量未在for循环中更新【英文标题】:JS Increment not updating in for loop of while using gcs API 【发布时间】:2021-10-31 14:59:52 【问题描述】:

我想创建一个仅在 GCS 上复制所有文件时运行的函数。 运行 createNewTemplateFolder 函数时,“copiedFileAmout”没有更新。

这是点击功能的代码

const fileNamesToCopy = ['index.html', 'main.css','script.js','video.js','videocss.css'];
const loopFiles = async(request,response) =>
    console.log(request.body)
    for (const fileNameEach of fileNamesToCopy) 
        const fileName = fileNameEach;
        // console.log(fileName)
        createNewTemplateFolder(bucketName, originalFolder + fileName,bucketName, newFolderPath + fileName, newFolderPath);      
       
      
    response.send("Folder Created ok.")

然后循环遍历 GCS 上的文件并复制到新文件夹。

const createNewTemplateFolder = async (srcBucketName, srcFilename, destBucketName,destFileName, destFilePath) =>
    // Copies the file to the new folder
    let copiedFileAmout = 0;
    await storage
      .bucket(srcBucketName)
      .file(srcFilename)
      .copy(storage.bucket(destBucketName).file(destFileName))
      .then(() =>
        console.log('copy done '+ destFileName)
        copyFileStatus = true;
        copiedFileAmout++  /// this is not working
      )
      .catch((err) =>
        console.log(err)
        copiedFileAmout++
      )
      
    if(copiedFileAmout === 5)
        uploadCombineDelete(destFilePath) // This function should only run once when all 5 files is copied
       

在谷歌上搜索但不确定 Promise 是否无法运行增量。 希望能得到这方面的建议,谢谢!

【问题讨论】:

为什么不在循环之后将呼叫移至uploadCombineDelete?这样,在所有文件都被复制后,它肯定会被调用,如果它有正确的值,你不必检查任何变量? 【参考方案1】:

您必须在函数之外(全局范围)声明变量copyedFileAmout。

let copiedFileAmout = 0;
const fileNamesToCopy = ['index.html', 'main.css','script.js','video.js','videocss.css'];
const loopFiles = async(request,response) =>
....
....

然后删除该行

let copiedFileAmout = 0; 

来自函数createNewTemplateFolder

【讨论】:

@Carol Chaw,如果这回答了您的问题,请告诉我们? 哦,奇怪的是,我一开始就将 'copiedFileAmout' 声明为全球性的,但它无法正常工作......但在你回答这个问题后现在工作正常,非常感谢! 【参考方案2】:

你有两个选择:

在函数之外声明copyedFileAmount,这样双方都可以访问它

let copiedFileAmount = 0;

或者一种不太有利的方法,只需将当前变量的声明从 let 更改为 var ,这样可以提供更大的范围。

var copiedFileAmount = 0;

【讨论】:

以上是关于使用gcs API时,JS增量未在for循环中更新的主要内容,如果未能解决你的问题,请参考以下文章

全局未在异步 for 循环中正确修改

Vue.js v-for 循环绑定数组中的项目对象并在更改时更新

将 CSV 从 GCS 批量加载到 BigQuery 时,表数据是增量查看还是仅在所有文件加载后才可查看?

BigQuery:导出表未在 GCS 中将 Content-Encoding 设置为 gzip

Vue 模板未在 for 循环中呈现

js循环