Javascript 如何使用异步函数更新后端数据?
我在一个音频编码桌面应用程序中工作,前端将向我发送名为jobdata的数据库数据,我必须更新jobdetails对象,该对象存在于jobdata数组中,如下所示Javascript 如何使用异步函数更新后端数据?,javascript,asynchronous,foreach,promise,Javascript,Asynchronous,Foreach,Promise,我在一个音频编码桌面应用程序中工作,前端将向我发送名为jobdata的数据库数据,我必须更新jobdetails对象,该对象存在于jobdata数组中,如下所示 "jobId": "dc67b147-754f-48e3-8233-da4aa66913d6", "currentLicenseCount": 1, "licenseId": "159bb263-b265-451a-ae3d-0d789d58
"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”在前端标记为true,我已经使用了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函数中,您没有很好地对其进行分解(您错过了AdditionalMetadata),这就是为什么它没有得到更新,正确的函数将是这样的
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',
当前许可证数量:1,
许可证编号:“159bb263-b265-451a-ae3d-0d789d586de7”,
完成时间:0,
reservedLicenseCount:3,
isComplete:错误,
用户ID:'5728f50d-146b-47d2-aa7b-a50bc37d641d',
更新日期:1616999479,
职位详情:[
{
编码强度:0,
contentValidation:对,
contentFilePath:“/home/ubuntu/Downloads/sample1(2.mp3)”,
其他元数据:{
格式:{
容器:“MPEG”,
持续时间:122.12244897959184,
编解码器:“MPEG 1第3层”,
trackInfo:[],
编解码器配置文件:“CBR”,
频道数量:2,
比特率:128000,
无损:假,
采样器:44100,
标记类型:['ID3v2.4'],
},
内容采样频率: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:错误,
文件ID:'f6722638-629a-4b88-a3cc-ac5334f762d5',
},
},
{
编码强度:0,
contentValidation:对,
contentFilePath:“/home/ubuntu/Downloads/sample1.mp3”,
其他元数据:{
格式:{
容器:“MPEG”,
持续时间:122.12244897959184,
编解码器:“MPEG 1第3层”,
trackInfo:[],
编解码器配置文件:“CBR”,
频道数量:2,
比特率:128000,
无损:假,
采样器:44100,
标记类型:['ID3v2.4'],
},
内容采样频率:128000,
contentFileType:null,
contentDescription:null,
索尼基:“8iYrr1p0O3X”,
contentDuration:122.12244897959184,
contentSize:0,
liscenseId:'159bb263-b265-451a-ae3d-0d789d586de7',
contentEncoding:null,
contentFileName:'sample1.mp3',
contentQuality:null,
contentType:'MPEG',
isComplete:错误,
文件ID:'05d1be20-f816-438b-8063-da25305459e7',
},
},
{
编码强度:0,
contentValidation:对,
contentFilePath:“/home/ubuntu/Downloads/sample3.mp3”,
其他元数据:{
格式:{
容器:“MPEG”,
持续时间:105.82204081632653,
编解码器:“MPEG 1第3层”,
trackInfo:[],
编解码器配置文件:“CBR”,
频道数量:2,
比特率:128000,
无损:假,
采样器:44100,
标记类型:['ID3v2.4'],
},
内容采样频率: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',
是的,
文件ID:'15e063ed-8e12-44cd-8674-011e2a189e26',
},
},
],
创建日期:1616999479,
jobName:“满足作业1”,
}
//标记文件完成并增加作业的当前许可证计数
让arrayFileData=[]
常量文件ID='05d1be20-f816-438b-8063-da25305459e7'
//添加了一个常量ID,可以将其假定为前端请求
arrayFileData=jobData.jobDetails
arrayFileData.forEach((项目,索引)=>{
if(fileId==item.additionalMetadata.fileId){
item.additionalMetadata.isComplete=true
jobData.currentLicenseCount=jobData.currentLicenseCount+1
}
})
console.log('Job Data:',jobData)
您可以发布整个foreach块吗?这里有几个未知变量。@IamL我已经为每个变量编写了逻辑…我想这不起作用…可以用其他方式完成吗?谢谢你的帮助,但如果有多个键必须更新,则不仅仅是“iscomplete”,在这里,我们不能指定必须在何处进行更改,因为无论前端发送什么,这些字段也必须由后端更新,如果您能帮助我与此相关,这将是很有帮助的。我们可以使用其他数组函数吗?只需要更新“jobDetails”中的字段或“jobData”中的任何内容?另外,如果可能的话,只需给我一个示例请求,比如哪些字段需要更新,这将帮助我理解需求。不不,不,只有“作业详细信息”中的字段……这里没有指定特定的键值对……就像我们指定了更新iscomplete标志,但如果不只是iscompl呢