Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/449.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用异步函数更新后端数据?_Javascript_Asynchronous_Foreach_Promise - Fatal编程技术网

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

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

我在一个音频编码桌面应用程序中工作,前端将向我发送名为jobdata的数据库数据,我必须更新jobdetails对象,该对象存在于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"
}
这里是一个对象数组,如果作业有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呢