javascript - 如何使用异步函数更新后端数据?
问题描述
我正在一个音频编码桌面应用程序中工作,前端将向我发送名为 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 来完成吗?
解决方案
在你的 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)
推荐阅读
- typescript - Typescript - 定义具有一些特定已知属性的对象类型,以及未定义数量的未知属性
- graphics - 计算有符号的二面角
- javascript - 包含对象的多维度数组的深度比较
- python - 发送请求 - 提供字典或字符串
- javascript - NODEJS mysql 结果未定义
- java - 如何提取 JsonArray 的第一个元素是 Integer 而另一个是 JsonElements?
- python - 为什么在这段代码中出现语法错误?
- angular - Angular Service Worker 不使用 Spring Boot Server
- c# - C# 根据属性值删除 XML 元素
- mysql - 从电子邮件中提取域并检查另一个表