微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用异步函数更新后端数据?

如何解决如何使用异步函数更新后端数据?

我正在使用音频编码桌面应用程序,其中前端将向我发送名为 jobdata 的数据库数据,我必须更新 jobdata 数组中存在的 jobdetails 对象,如下所示

 "jobId": "dc67b147-754f-48e3-8233-da4aa66913d6","currentLicenseCount": 1,"licenseId": "159bb263-b265-451a-ae3d-0d789d586de7","completedAt": 0,"reservedLicenseCount": 3,"isComplete": false,"userId": "5728f50d-146b-47d2-aa7b-a50bc37d641d","updatedAt": 1616999479,"jobDetails": [
  {
   "encodingStrength": 0,"contentValidation": true,"contentFilePath": "/home/ubuntu/Downloads/sample1 (2).mp3","additionalMetadata": {
    "format": {
     "container": "MPEG","duration": 122.12244897959184,"codec": "MPEG 1 Layer 3","trackInfo": [],"codecProfile": "CBR","numberOfChannels": 2,"bitrate": 128000,"lossless": false,"sampleRate": 44100,"tagTypes": [
      "ID3v2.4"
     ]
    },"contentSamplingFrequency": 128000,"contentFileType": null,"contentDescription": null,"sonicKey": "fooyGoXpdAf","contentDuration": 122.12244897959184,"contentSize": 0,"liscenseId": "159bb263-b265-451a-ae3d-0d789d586de7","contentEncoding": null,"contentFileName": "sample1 (2).mp3","contentQuality": null,"contentType": "MPEG","fileId": "f6722638-629a-4b88-a3cc-ac5334f762d5"
  },{
   "encodingStrength": 0,"contentFilePath": "/home/ubuntu/Downloads/sample1.mp3","sonicKey": "8iYrr1p0O3X","contentFileName": "sample1.mp3","fileId": "05d1be20-f816-438b-8063-da25305459e7"
  },"contentFilePath": "/home/ubuntu/Downloads/sample3.mp3","duration": 105.82204081632653,"sonicKey": "uwE4yCM_2YO","contentDuration": 105.82204081632653,"contentFileName": "sample3.mp3","isComplete": true,"fileId": "15e063ed-8e12-44cd-8674-011e2a189e26"
  }
 ],"createdAt": 1616999479,"jobName": "meet job 1"
}

这里是一个对象数组,如果作业有 3 个文件并且我必须将“iscomplete”标志更新为 true 并且我不能直接将元素设为 true 因为可能有多个文件 ID 的 ...所以我只需要迭代直到数组的长度并在我的后端更新“iscomplete”,我在前端发现“iscomplete”标志为真,我使用了 foreach 循环,但我不知道为什么这部分没有没有更新....


    //mark file completion and increment the current license count of the job
    var arrayFileData = [];
    arrayFileData = jobData.jobDetails;
    arrayFileData.forEach(function (_value,i) {
      if ((fileId == arrayFileData[i]['fileId'])) {
        arrayFileData[i]['isComplete'] = true;
        jobData['currentLicenseCount'] = jobData['currentLicenseCount'] + 1;
        jobData.jobDetails = arrayFileData;
      }
    });
   

可以使用 async/await 或 promise 来完成吗?

解决方法

在你的 forEach 函数中,你没有很好地解构它(你错过了 additonalMetadata)这就是为什么它没有得到更新,正确的函数将是这样的

   if ((fileId == arrayFileData[i]['additionalMetadata']['fileId'])) {
     arrayFileData[i]['additionalMetadata']['isComplete'] = true;
     jobData['currentLicenseCount'] = jobData['currentLicenseCount'] + 1;
     jobData.jobDetails = arrayFileData;
   }
 });

或者您可以使用更简化的功能,例如

let arrayFileData = []
const fileId = '05d1be20-f816-438b-8063-da25305459e7'
arrayFileData = jobData.jobDetails

arrayFileData.forEach((item,index) => {
  if (fileId === item.additionalMetadata.fileId) {
    item.additionalMetadata.isComplete = true
    jobData.currentLicenseCount = jobData.currentLicenseCount + 1
  }
})

我们只能在异步函数中使用 async/await 或 promise,这是一个同步函数,所以不能在其中使用 async/await 或 promise。

我也附上了示例代码并更新了其中一个fileId,你也可以看看。

const jobData = {
  jobId: 'dc67b147-754f-48e3-8233-da4aa66913d6',currentLicenseCount: 1,licenseId: '159bb263-b265-451a-ae3d-0d789d586de7',completedAt: 0,reservedLicenseCount: 3,isComplete: false,userId: '5728f50d-146b-47d2-aa7b-a50bc37d641d',updatedAt: 1616999479,jobDetails: [
    {
      encodingStrength: 0,contentValidation: true,contentFilePath: '/home/ubuntu/Downloads/sample1 (2).mp3',additionalMetadata: {
        format: {
          container: 'MPEG',duration: 122.12244897959184,codec: 'MPEG 1 Layer 3',trackInfo: [],codecProfile: 'CBR',numberOfChannels: 2,bitrate: 128000,lossless: false,sampleRate: 44100,tagTypes: ['ID3v2.4'],},contentSamplingFrequency: 128000,contentFileType: null,contentDescription: null,sonicKey: 'fooyGoXpdAf',contentDuration: 122.12244897959184,contentSize: 0,liscenseId: '159bb263-b265-451a-ae3d-0d789d586de7',contentEncoding: null,contentFileName: 'sample1 (2).mp3',contentQuality: null,contentType: 'MPEG',fileId: 'f6722638-629a-4b88-a3cc-ac5334f762d5',{
      encodingStrength: 0,contentFilePath: '/home/ubuntu/Downloads/sample1.mp3',sonicKey: '8iYrr1p0O3X',contentFileName: 'sample1.mp3',fileId: '05d1be20-f816-438b-8063-da25305459e7',contentFilePath: '/home/ubuntu/Downloads/sample3.mp3',duration: 105.82204081632653,sonicKey: 'uwE4yCM_2YO',contentDuration: 105.82204081632653,contentFileName: 'sample3.mp3',isComplete: true,fileId: '15e063ed-8e12-44cd-8674-011e2a189e26',],createdAt: 1616999479,jobName: 'meet job 1',}

//mark file completion and increment the current license count of the job
let arrayFileData = []
const fileId = '05d1be20-f816-438b-8063-da25305459e7'
//Added a constant ID,can assume it as a frontend request
arrayFileData = jobData.jobDetails

arrayFileData.forEach((item,index) => {
  if (fileId === item.additionalMetadata.fileId) {
    item.additionalMetadata.isComplete = true
    jobData.currentLicenseCount = jobData.currentLicenseCount + 1
  }
})

console.log('Job Data :',jobData)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。