首页 > 解决方案 > 如何使用异步函数更新后端数据?

问题描述

我正在一个音频编码桌面应用程序中工作,前端将向我发送名为 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",
   "isComplete": false,
   "fileId": "f6722638-629a-4b88-a3cc-ac5334f762d5"
  },
  {
   "encodingStrength": 0,
   "contentValidation": true,
   "contentFilePath": "/home/ubuntu/Downloads/sample1.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": "8iYrr1p0O3X",
   "contentDuration": 122.12244897959184,
   "contentSize": 0,
   "liscenseId": "159bb263-b265-451a-ae3d-0d789d586de7",
   "contentEncoding": null,
   "contentFileName": "sample1.mp3",
   "contentQuality": null,
   "contentType": "MPEG",
   "isComplete": false,
   "fileId": "05d1be20-f816-438b-8063-da25305459e7"
  },
  {
   "encodingStrength": 0,
   "contentValidation": true,
   "contentFilePath": "/home/ubuntu/Downloads/sample3.mp3",
   "additionalMetadata": {
    "format": {
     "container": "MPEG",
     "duration": 105.82204081632653,
     "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": "uwE4yCM_2YO",
   "contentDuration": 105.82204081632653,
   "contentSize": 0,
   "liscenseId": "159bb263-b265-451a-ae3d-0d789d586de7",
   "contentEncoding": null,
   "contentFileName": "sample3.mp3",
   "contentQuality": null,
   "contentType": "MPEG",
   "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 来完成吗?

标签: javascriptasynchronousforeachpromise

解决方案


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

   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',
        isComplete: false,
        fileId: 'f6722638-629a-4b88-a3cc-ac5334f762d5',
      },
    },
    {
      encodingStrength: 0,
      contentValidation: true,
      contentFilePath: '/home/ubuntu/Downloads/sample1.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: '8iYrr1p0O3X',
        contentDuration: 122.12244897959184,
        contentSize: 0,
        liscenseId: '159bb263-b265-451a-ae3d-0d789d586de7',
        contentEncoding: null,
        contentFileName: 'sample1.mp3',
        contentQuality: null,
        contentType: 'MPEG',
        isComplete: false,
        fileId: '05d1be20-f816-438b-8063-da25305459e7',
      },
    },
    {
      encodingStrength: 0,
      contentValidation: true,
      contentFilePath: '/home/ubuntu/Downloads/sample3.mp3',
      additionalMetadata: {
        format: {
          container: 'MPEG',
          duration: 105.82204081632653,
          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: 'uwE4yCM_2YO',
        contentDuration: 105.82204081632653,
        contentSize: 0,
        liscenseId: '159bb263-b265-451a-ae3d-0d789d586de7',
        contentEncoding: null,
        contentFileName: 'sample3.mp3',
        contentQuality: null,
        contentType: 'MPEG',
        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)


推荐阅读